0

Скажем, у меня есть список списков строк (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}} 

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

ответ

3

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

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) 
+0

Отлично, спасибо. – StatsViaCsh

0

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

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

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

3
>>> 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 и использовать список, чтобы быть значение сделает результат более ясным:

>>> {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]} 
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))