如何在python中反转字典并从重复的键值中创建一个列表

Posted

技术标签:

【中文标题】如何在python中反转字典并从重复的键值中创建一个列表【英文标题】:How to reverse a dictionary in python and create a list out of the duplicate keys value 【发布时间】:2022-01-16 09:03:35 【问题描述】:

我今天给自己一个任务,只是想在 Python 中弄清楚下面的练习:

# given the dictionary below

dic = 
  "jane": "doe",
  "remy": "ma",
  "haaland": "buuk",
  "adam": "doe",


new_dict = 

for x, y in dic.items():
  if y not in new_dict.keys(): 
    new_dict[y] = x
  else:
    new_dict[y] = [x]

print("results: ", new_dict)

# results:  'doe': ['adam'], 'ma': 'remy', 'buuk': 'haaland'

我怎样才能达到以下结果?

results: 'doe': ['jane', 'adam'], 'ma': 'remy', 'buuk': 'haaland'

【问题讨论】:

【参考方案1】:

最直接的解决方案是:

from collections import defaultdict

res = defaultdict(list)
for key, val in sorted(dic.items()):
    res[val].append(key)

香草字典也可以做到这一点:

res = 
for i, v in d_input.items():
    res[v] = [i] if v not in res.keys() else res[v] + [i]

使用pandas 的简洁解决方案:

import pandas as pd

pd.Series(dic).reset_index().groupby(0).agg(list).to_dict()['index']

【讨论】:

【参考方案2】:
def reverse_dict(d):
    inv = 
    for k, v in d.items():
        if v in inv:
            inv[v].append(k)
        else:
            inv[v] = [k]
    return inv

dic = 
  "jane": "doe",
  "remy": "ma",
  "haaland": "buuk",
  "adam": "doe",


print(reverse_dict(dic))

【讨论】:

【参考方案3】:

您也可以使用dict.setfault 方法来反转键值顺序。然后再次遍历字典以从单例列表中取出项目以完全匹配您想要的结果:

out = 
for k,v in dic.items():
    out.setdefault(v,[]).append(k)
    
out = k: v if len(v)>1 else v[0] for k,v in out.items()

输出:

'doe': ['jane', 'adam'], 'ma': 'remy', 'buuk': 'haaland'

【讨论】:

以上是关于如何在python中反转字典并从重复的键值中创建一个列表的主要内容,如果未能解决你的问题,请参考以下文章

python 中关于字典的键

如何在python中打印字典的键值对

python反转字典键值

我可以在 TypeScript 中创建一个对每个键值对都是类型安全的键值字典吗?

以pythonic方式打印字典中最大值的键[重复]

python列表中字典按指定相同的键值对合并到一个列表中