Как мне добавить значения к набору в понимании?
Допустим, у меня есть список списков строк (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
и проверяет, находится ли он в первом списке, во втором списке и т. д., и соответственно обновляет словарь.