【问题标题】:How to invert dictionary with multiple values of each key?如何用每个键的多个值反转字典?
【发布时间】:2022-01-25 16:21:38
【问题描述】:

我一直在努力。我有以下字典。

Subject1='Math'
Subject2='English'
Subject3='Chemstry'
Subject4='Physics'
Subject5='Geology'
Subject6='PE'
Subject7='Music'
Subject8='Psychology'
Subject9='Politics'
Subject10='Acting'

dict_1 = {(Subject1, Subject2):['Michael','James','Lydia'],
          (Subject3, Subject4):['Michael','Lydia','James'],
          (Subject5, Subject6):['Tom'],
          (Subject7, Subject8):[],
          (Subject9, Subject10):[]
}

我想反转字典,使它看起来像:

{['Michael', 'James', 'Lydia']: {(Subject1, Subject2), (Subject3, Subject4)}, 
 ['Tom']: {(Subject5, Subject6)}, 
 []: {(Subject7, Subject8), (Subject9, Subject10)} }

我试过了

from collections import defaultdict

new_tel = defaultdict(list)
for key, value in dict_1.items():
    new_tel[value].append(key)

这适用于可散列类型,但不适用于不可散列类型列表。也许我可以将['Michael','James','Lydia'] 的字符串加入'James Lydia Michael' 以便它可以成为有效的密钥?如何对列表['Michael','James','Lydia']['Michael','Lydia','James'] 中的元素进行排序,以便在我加入它们之前按字母顺序排列?

这是一个更容易实现的输出:

{'James Lydia Michael': {(Subject1, Subject2), (Subject3, Subject4)}, 
 'Tom': {(Subject5, Subject6)}, 
 'None': {(Subject7, Subject8), (Subject9, Subject10)} }

【问题讨论】:

  • 您不能将列表用作字典键。
  • ...但您可以使用元组代替
  • 字典键是不可变的 我现在知道了。谢谢!

标签: python dictionary


【解决方案1】:

字典键不能是列表,但可以是元组。因此,您可以执行以下操作。对值进行排序,使它们成为元组以用作键并使用dict.setdefault

out = {}
for k,v in dict_1.items():
    out.setdefault(tuple(sorted(v)), set()).add(k)

输出:

{('James', 'Lydia', 'Michael'): {('Chemstry', 'Physics'), ('Math', 'English')},
 ('Tom',): {('Geology', 'PE')},
 (): {('Music', 'Psychology'), ('Politics', 'Acting')}}

【讨论】:

    【解决方案2】:

    正如问题中所说,cmets 列表是不可散列的。如果您可以改用元组,“Dict Comprehensions”是一个好方法。更多信息:https://www.python.org/dev/peps/pep-0274/

    dict_reverse = {tuple(dict_1[key]): key for key in dict_1.keys()}
    

    【讨论】:

      【解决方案3】:

      最简单的方法是使用 tuple 作为键类型

      for key, value in dict_1.items():
          new_tel[tuple(sorted(value))].append(key)
      
      
      {('James', 'Lydia', 'Michael'): [('Math', 'English'), ('Chemstry', 'Physics')], 
       ('Tom',): [('Geology', 'PE')],  
       (): [('Music', 'Psychology'), ('Politics', 'Acting')]})
      

      如果加入设置密钥类型为str

      for key, value in dict_1.items():
          new_tel[" ".join(sorted(value))].append(key)
      
      
      {'James Lydia Michael': [('Math', 'English'), ('Chemstry', 'Physics')], 
       'Tom': [('Geology', 'PE')], 
       '': [('Music', 'Psychology'), ('Politics', 'Acting')]})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-05
        • 2022-11-26
        相关资源
        最近更新 更多