【问题标题】:How to reverse a dictionary in python and create a list out of the duplicate keys value如何在python中反转字典并从重复的键值中创建一个列表
【发布时间】: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'}

【问题讨论】:

    标签: python dictionary group-by


    【解决方案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'}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-20
          • 1970-01-01
          • 2023-02-24
          相关资源
          最近更新 更多