python-搜索字典子列表;将字典键转换为值

时间:2015-05-07 10:38:33

标签: python search dictionary sublist

说我有以下字典(我使用的字典更多,更大):

all_words=["item", "word", "thing"]

并将字典中使用的每个单词都存储在列表中:

dict2={"item":(1, 2, 3), "word":(1, 2), "thing":(1, 3)}

我希望通过字典子列表运行列表中的每个单词,并返回找到它们的所有子列表的键,并将它们存储在元组中。所以我想得到:

dict2={}    
for word in all_words:
    for key, sublist in dict2.items():
        for word in sublist:
            if word not in sublist:
                dict2[word]=dict2[word]+key
            else:
                dict2[word]=key

继承人我所拥有的:

Enumerable.Zip

3 个答案:

答案 0 :(得分:6)

所以,基于评论的固定程序看起来像这样

>>> dict2 = {}
>>> for word in all_words:
...     # Iterate over the dict1's items
...     for key, sublist in dict1.items():
...         # If the word is found in the sublist
...         if word in sublist:
...             # If the current word is found in dict2's keys
...             if word in dict2:
...                 # Append the current key as a one element tuple
...                 dict2[word] += (key,)
...             else:
...                 # Create a one element tuple and assign it to the word
...                 dict2[word] = (key,)
... 
>>> dict2
{'item': (1, 2, 3), 'word': (1, 2), 'thing': (1, 3)}

如果您了解字典理解,那么同样可以写成

>>> {word: tuple(k for k, v in dict1.items() if word in v) for word in all_words}
{'item': (1, 2, 3), 'word': (1, 2), 'thing': (1, 3)}

基于每个对应dict1的{​​{1}}的整个元组创建逻辑已被挤压为单个生成器表达式并转换为具有word的元组

答案 1 :(得分:3)

你的代码的逻辑是不正确的,因为你只是迭代3个对象,而你只需要遍历你的字典并反转键和值的位置但是因为你可能有重复的值你可以使用set容器用于保留每个名称的相应键。对于这种情况,dict.setdefault是一个很好的工具:

>>> d={}
>>> for i,j in dict1.items():
...    for k in j:
...      d.setdefault(k,set()).add(i)
... 
>>> d
{'item': set([1, 2, 3]), 'word': set([1, 2]), 'thing': set([1, 3])}

答案 2 :(得分:1)

问题是你正在循环dict2.items,而它应该是dict1.items。此外,如果找到了{em>将键附加到dict2值,您只需将值重新分配给dict1值中的最后一个键即可。因此,dict2值不是您所期望的。

相反,您可以使用collections.defaultdict(或使用来自@Kasra的解决方案,@ thefourtheye):

from collections import defaultdict

dict2 = defaultdict(tuple)

for word in all_words:
    for key, sublist in dict1.iteritems(): # this 
        if word in sublist:
            dict2[word] += (k,)
        else:
            dict2[word] = (k,)

dict2
Out[3]: defaultdict(<type 'tuple'>, {'item': (1, 2, 3), 'word': (1, 2), 'thing': (1, 3)})