Как мне добавить значения к набору в понимании?

Допустим, у меня есть список списков строк (stringList):

[['its', 'all', 'ball', 'bearings', 'these', 'days'], 
['its', 'all', 'in', 'a', 'days', 'work']]

и у меня также есть набор строк (stringSet), которые являются уникальными словами из stringList:

{'its', 'all', 'ball', 'bearings', 'these', 'days', 'in', 'a', 'work'}

Используя понимание, если возможно, как я могу получить словарь, который сопоставляет каждое слово в stringSet со словарем индексов stringList, которые содержат это слово? В приведенном выше примере возвращаемое значение будет:

{'its': {0,1}, 'all':{0,1}, 'ball':{0}, 'bearings':{0}, 'these':{0}, 'days':{0,1}, 'in':{1}, 'a':{1}, 'work':{1}}

Мое зависание - как накапливать индексы в словаре. Я уверен, что это относительно просто для тех, кто идет дальше, чем я. Заранее спасибо...

4 ответа

Решение

Это похоже на работу:

str_list = [
    ['its', 'all', 'ball', 'bearings', 'these', 'days'], 
    ['its', 'all', 'in', 'a', 'days', 'work']
]
str_set = set(word for sublist in str_list for word in sublist)

str_dict = {word: set(lindex
        for lindex, sublist in enumerate(str_list) if word in sublist)
    for word in str_set}

print (str_dict)
>>> alist = [['its', 'all', 'ball', 'bearings', 'these', 'days'], 
... ['its', 'all', 'in', 'a', 'days', 'work']]
>>> aset = {'its', 'all', 'ball', 'bearings', 'these', 'days', 'in', 'a', 'work'}

>>> {x: {alist.index(y) for y in alist if x in y} for x in aset}
{'a': set([1]), 'all': set([0, 1]), 'ball': set([0]), 'these': set([0]), 'bearings': set([0]), 'work': set([1]), 'days': set([0, 1]), 'in': set([1]), 'its': set([0, 1])}

Также вы можете использовать enumerate и использование list в качестве значения сделает результат более понятным:

>>> {x: [i for i, y in enumerate(alist) if x in y] for x in aset}
{'a': [1], 'all': [0, 1], 'ball': [0], 'these': [0], 'bearings': [0], 'work': [1], 'days': [0, 1], 'in': [1], 'its': [0, 1]}

Вот мой код, работающий с несколькими вложенными циклами, попытался сделать что-то, что вы найдете легко читаемым и понятным!

def accumulate(stringList,stringSet):
    outputDict = {}
    for setItem in stringSet:
        outputItem = set()
        for i,listItem in enumerate(stringList):
            if setItem in listItem:
                outputItem.add(i)
        outputDict[setItem] = outputItem
    return outputDict

stringList = [['its', 'all', 'ball', 'bearings', 'these', 'days'], ['its', 'all', 'in', 'a', 'days', 'work']]
stringSet = {'its', 'all', 'ball', 'bearings', 'these', 'days', 'in', 'a', 'work'}

print(accumulate(stringList,stringSet))

Вы можете использовать вложенный цикл:

result = {}
for w in stringSet:
    result[w] = []
    for i,l in enumerate(stringList):
        if w in l:
            result[w].append(i)

Что это делает, что это проходит через каждое слово в stringSetи проверяет, находится ли он в первом списке, во втором списке и т. д., и соответственно обновляет словарь.

Другие вопросы по тегам