【问题标题】:How to create a dictionary with duplicate keys and form a list of dictionary如何创建具有重复键的字典并形成字典列表
【发布时间】:2020-04-19 13:21:38
【问题描述】:

我正在尝试编写一个程序,其中我有以下方式的字典列表

[
  {
    'unique':1,
    'duplicate':2,
  },
  {
    'unique':1,
    'duplicate':2,
  },
  {
    'unique':1,
    'duplicate':2,
  },
  {
    'unique':1,
    'duplicate':2,
  }
]

我们能不能把它做成一个字典,其中元组中的第一个键应该变成字典中的唯一键 它是对应的值作为该值的列表

示例:

[
  {
   'unique':1,
   'duplicate':2,
  }, 
 {
  'unique':1,
  'duplicate':8,
 },
 {
  'unique':2,
  'duplicate':2,
 },
 {
  'unique':1,
  'duplicate':4,
 }
]

The above list should be converted into the following
---- Expected Outcome ---
[
  {
   'unique':1,
   'duplicates':[2,8,4]
  },
  {
   'unique':2,
   'duplicates':[2]
  }
]

PS:我在 python

中这样做

提前感谢您提供代码

【问题讨论】:

  • 可能 dict 将其理解为一个列表,然后将该列表转换为一个集合,然后再返回一个 dict。

标签: python json list dictionary


【解决方案1】:

你也可以使用itertools.groupby:

from itertools import groupby
from operator import itemgetter

l = [
  {
   'unique':1,
   'duplicate':2,
  }, 
 {
  'unique':1,
  'duplicate':8,
 },
 {
  'unique':2,
  'duplicate':2,
 },
 {
  'unique':1,
  'duplicate':4,
 }
]

key = itemgetter('unique')
result = [{'unique':k, 'duplicate': list(map(itemgetter('duplicate'), g))}
          for k, g in groupby(sorted(l, key=key ), key = key)]
print(result)

输出:

[{'unique': 1, 'duplicate': [2, 8, 4]}, {'unique': 2, 'duplicate': [2]}]

【讨论】:

    【解决方案2】:

    我认为这个列表理解可以解决你的问题:

    result = [{'unique': id, 'duplicates': [d['duplicate'] for d in l if d['unique'] == id]} for id in set(map(lambda d: d['unique'], l))]
    

    【讨论】:

      【解决方案3】:

      这可能会对您有所帮助:

      l = [
        {
         'unique':1,
         'duplicate':2,
        }, 
       {
        'unique':1,
        'duplicate':8,
       },
       {
        'unique':2,
        'duplicate':2,
       },
       {
        'unique':1,
        'duplicate':4,
       }
      ]
      
      a = set()
      for i in l:
          a.add(i['unique'])
      d = {i:[] for i in a }
      for i in l:
          d[i['unique']].append(i['duplicate'])
      output = [{'unique': i, 'duplicate': j}for i, j in d.items()]
      

      输出将是:

      [{'unique': 1, 'duplicate': [2, 8, 4]}, {'unique': 2, 'duplicate': [2]}]
      

      【讨论】:

        【解决方案4】:

        defaultdict(list) 可以在这里为您提供帮助:

        from collections import defaultdict
        
        # data = [ {'unique': 1, 'duplicate': 2}, ... ]  # your data
        dups = defaultdict(list) # {unique: [duplicate]}
        
        for dd in data:
            dups[dd['unique']].append(dd['duplicate'])
        
        answer = [dict(unique = k, duplicates = v) for k, v in dups.items()]
        

        如果您不知道唯一键的名称,请将'unique' 替换为类似

        unique_key = list(data[0].keys())[0]
        

        【讨论】:

          【解决方案5】:
          unique=[]
          duplicate ={}
          for items in data:
             if items['unique'] not in unique:
                 unique.append(items['unique'])
                 duplicate[items['unique']]=[items['duplicate']]
             else:
                 duplicate[items['unique']].append(items['duplicate'])
          
          new_data=[]
          for key in unique:
              new_data.append({'unique':key,'duplicate':duplicate[key]})
          

          说明:在第一个 for 循环中,我将唯一键附加到“唯一”。如果“唯一”中不存在该键,我会将其附加到“唯一”中并在“重复”中添加一个键,其值为单个元素列表。如果再次找到相同的键,我只需将该值附加到与键对应的“重复”中。在第二个循环中,我正在创建一个“new_dict”,在其中添加这些唯一键及其重复值列表

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-07
            • 2020-01-22
            • 1970-01-01
            • 2021-02-21
            • 2018-08-22
            • 2021-09-04
            • 2014-12-09
            • 1970-01-01
            相关资源
            最近更新 更多