Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的逆Dict_Python_Data Structures_Dictionary - Fatal编程技术网

Python中的逆Dict

Python中的逆Dict,python,data-structures,dictionary,Python,Data Structures,Dictionary,我正在尝试使用现有dict的值列表作为单个键来创建一个新dict 例如: 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']}) 到目前为止,我还不能以一种非常干净的方式来做这件事。有什么建议吗?如果您使用的是Python 2.5或更高版本,请使用该模块;defaultdict在第一次访问

我正在尝试使用现有dict的值列表作为单个键来创建一个新dict

例如:

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

到目前为止,我还不能以一种非常干净的方式来做这件事。有什么建议吗?

如果您使用的是Python 2.5或更高版本,请使用该模块;
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中的列表不会按任何特定顺序排列,因为字典不会对其键值对进行排序


如果您希望在最后输出一个普通的dict,该dict会因缺少键而引发
KeyError
,只需在上述步骤之后使用
dict2=dict(dict2)

注意,在示例中不需要
dict
{/code>语法为您提供了一个dict:

dict1 = {'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]}
其他方式:

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

出于好奇:你为什么需要它?它需要在两个方向上都可以访问,因为它会发生很多次,并且需要是可序列化的,理想情况下,不引入更多的类,这些类如果在单独的模块中使用,则需要导入,因为我正在使用的特定系统的工作方式非常复杂。-1对于Python的可怕滥用:(1)列表理解不应该有副作用(2)为了实现“a然后b”而扭曲布尔逻辑我真希望我能投两次反对票,只是为了说明问题。请把它从痛苦中解脱出来。你不需要一个defaultdict来完成这件简单的事情。只需将追加行替换为:dict2.setdefault(值,[])。append(键)您永远不需要默认dict。它只会使代码更简单。