【问题标题】:Inverse Dict in PythonPython中的逆字典
【发布时间】:2010-11-27 11:04:12
【问题描述】:

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

例如:

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 data-structures dictionary


【解决方案1】:

如果您使用的是 Python 2.5 或更高版本,请使用 defaultdict class from the 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)

【讨论】:

  • 你不需要一个 defaultdict 来做这个简单的事情。只需将附加行替换为: dict2.setdefault(value, []).append(key)
  • 你永远“不需要”一个默认的字典。它只是让代码更简单。
【解决方案2】:

请注意,您的示例中不需要 dict{} 语法为您提供了一个 dict:

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

【讨论】:

    【解决方案3】:

    其他方式:

    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 then b”
    • 我真的希望我能投反对票两次,只是为了说明这一点。请把它从痛苦中解救出来。
    猜你喜欢
    • 2010-11-06
    • 2020-02-13
    • 2012-01-22
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2014-02-17
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多