Python中的逆字典

2 投票
3 回答
805 浏览
提问于 2025-04-15 14:14

我想用一个已有字典里的值来创建一个新的字典,把这些值当成单独的键。

举个例子:

dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})

我希望得到:

dict2 = dict({1:['a','b','c'], 2:['a','b','c'], 3:['a','b'], 4:['b']})

到目前为止,我还没找到一个很简单的方法来做到这一点。有没有什么建议?

3 个回答

-3

另一种方法:

dict2={}
[[ (dict2.setdefault(i,[]) or 1) and (dict2[i].append(x)) for i in y ] for (x,y) in dict1.items()]  
4

注意,你在例子中并不需要写出 dict:使用 {} 这种写法就可以得到一个字典(dict)了。

dict1 = {'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]}
8

如果你使用的是Python 2.5或更高版本,可以使用defaultdict类,它在collections模块里。这个defaultdict会在你第一次访问一个不存在的键时自动创建对应的值,所以你可以用它来为dict2创建列表,像这样:

from collections import defaultdict
dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})
dict2 = defaultdict(list)
for key, values in dict1.items():
    for value in values:
        # The list for dict2[value] is created automatically
        dict2[value].append(key)

需要注意的是,dict2里的列表不会有特定的顺序,因为字典里的键值对是没有顺序的。

如果你想要最后得到一个普通的字典,并且在访问不存在的键时会抛出KeyError错误,只需在上面的代码之后加上dict2 = dict(dict2)就可以了。

撰写回答