如何使用重复键创建字典并形成字典列表

时间:2020-04-19 13:21:38

标签: python json list dictionary

我正在尝试编写一种程序,其中要以下列方式显示字典列表

[
  {
    '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

中执行此操作

预先感谢代码

5 个答案:

答案 0 :(得分: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]}]

答案 1 :(得分:0)

我认为这种列表理解可以解决您的问题:

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

答案 2 :(得分:0)

这可能会帮助您:

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]}]

答案 3 :(得分:0)

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]

答案 4 :(得分:0)

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”,在其中添加这些唯一键及其重复值列表