Как создать словарь с дубликатами ключей и сформировать список словаря - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь написать программу, в которой у меня есть список словарей следующим образом

[
  {
    '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 голосов
/ 19 апреля 2020

Вы также можете использовать 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]}]
0 голосов
/ 19 апреля 2020
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]})

Объяснение: В первом для l oop я добавляю уникальные ключи к 'unique'. Если ключ не существует в «уникальном», я добавлю его в «уникальный» и добавлю ключ в «дубликат» со значением в виде списка из одного элемента. Если тот же ключ будет найден снова, я просто добавлю это значение в «дубликат», соответствующий ключу. Во втором l oop я создаю 'new_dict', где я добавляю эти уникальные ключи и список дубликатов значений

0 голосов
/ 19 апреля 2020

Это может помочь вам:

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]}]
0 голосов
/ 19 апреля 2020

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]
0 голосов
/ 19 апреля 2020

Я думаю, что это понимание списка может решить вашу проблему:

result = [{'unique': id, 'duplicates': [d['duplicate'] for d in l if d['unique'] == id]} for id in set(map(lambda d: d['unique'], l))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...