使用列表值反转字典

2024-09-28 15:05:29 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我把这个索引作为一个字典

index = {'Testfil2.txt': ['nisse', 'hue', 'abe', 'pind'], 'Testfil1.txt': ['hue', 'abe', 
'tosse', 'svend']}

我需要反转索引,这样它将是一个dict,其中的重复值合并为一个键,而两个原始键作为值,如下所示:

inverse = {'nisse' : ['Testfil2.txt'], 'hue' : ['Testfil2.txt', 'Testfil1.txt'], 
'abe' : ['Testfil2.txt', 'Testfil1.txt'], 'pind' : ['Testfil2.txt'], 'tosse' : 
['Testfil1.txt'], 'svend' : ['Testfil1.txt']

是的,我用手打了上面的。

我的课本有翻字典的功能:

def invert_dict(d): 
    inverse = dict() 
    for key in d: 
        val = d[key] 
        if val not in inverse: 
            inverse[val] = [key] 
        else: 
            inverse[val].append(key) 
return inverse

对于简单的键:值对,它工作得很好

但是,当我用一个dict尝试该函数时,该dict将列表作为值,例如myindex,我会收到以下错误消息:

invert_dict(index)

Traceback (most recent call last):
    File "<pyshell#153>", line 1, in <module>
invert_dict(index)
    File "<pyshell#150>", line 5, in invert_dict
if val not in inverse:
TypeError: unhashable type: 'list'

我已经找了一个小时的解决方案,这本书没有帮助,我怀疑我可以用元组在某种程度上,但我不知道如何。有什么帮助吗?


Tags: keyintxtindexvalhuedictinverse
3条回答

我试过了,你想使用val not in inverse,但如果“列表在dict中”,则无法检查它。(val是一个列表)

对于您的代码,一个简单的更改将执行您想要的操作:

def invert_dict(d): 
    inverse = dict() 
    for key in d: 
        # Go through the list that is saved in the dict:
        for item in d[key]:
            # Check if in the inverted dict the key exists
            if item not in inverse: 
                # If not create a new list
                inverse[item] = [key] 
            else: 
                inverse[item].append(key) 
    return inverse

不能使用list对象作为字典键,因为它们应该是散列对象。您可以循环您的项并使用dict.setdefault方法创建预期结果:

>>> new = {}
>>> 
>>> for k,value in index.items():
...     for v in value:
...         new.setdefault(v,[]).append(k)
... 
>>> new
{'hue': ['Testfil2.txt', 'Testfil1.txt'], 'svend': ['Testfil1.txt'], 'abe': ['Testfil2.txt', 'Testfil1.txt'], 'tosse': ['Testfil1.txt'], 'pind': ['Testfil2.txt'], 'nisse': ['Testfil2.txt']}

如果您处理的是拒绝在每次调用setdefault()方法时创建空列表的较大数据集,则可以使用collections.defaultdict(),它将在遇到新键时调用丢失的函数。

from collections import defaultdict

new = defaultdict(list)
for k,value in index.items():
    for v in value:
        new[v].append(k)

>>> new
defaultdict(<type 'list'>, {'hue': ['Testfil2.txt', 'Testfil1.txt'], 'svend': ['Testfil1.txt'], 'abe': ['Testfil2.txt', 'Testfil1.txt'], 'tosse': ['Testfil1.txt'], 'pind': ['Testfil2.txt'], 'nisse': ['Testfil2.txt']})

我倒字典的办法。但是,它创建了一个新字典new_dic

new_dic = {}
for k,v in index.items():
    for x in v:
        new_dic.setdefault(x,[]).append(k)

输出:

{'tosse': ['Testfil1.txt'], 'nisse': ['Testfil2.txt'], 'svend': ['Testfil1.txt'], 'abe': ['Testfil1.txt', 'Testfil2.txt'], 'pind': ['Testfil2.txt'], 'hue': ['Testfil1.txt', 'Testfil2.txt']}

相关问题 更多 >