Объединение уникальных значений из списка словарей с одинаковыми ключами в Python - PullRequest
0 голосов
/ 02 декабря 2011

Я работаю со списком словарей и пытаюсь объединить их в один со следующими условиями:

  1. Все словари в списке имеют одинаковые ключи, и новый словарь также будет
  2. Если значения для данного ключа во всех словарях одинаковы, то это значение появится один раз в значении для нового словаря
  3. Если значения для данного ключа в качестве словарей являются уникальными, то значение этого ключа в новом словаре будет разделять запятыми все значения

Так что на самом деле я пытаюсь создать набор для заданного ключа в нескольких словарях и создать разделенную запятыми строку этого набора для значения в новом словаре. Чтобы помочь визуализировать, дано:

data = [ {"key1": "value1", "key2": "value2", "key3": "value3"},  
         {"key1": "value4", "key2": "value5", "key3": "value3"}, 
         {"key1": "value1", "key2": "value8", "key3": "value3"} ]

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

myDict = {"key1": "value1, value4", "key2": "value2, value5, value8", "key3": "value3"}

Есть идеи, как этого добиться?

Ответы [ 3 ]

5 голосов
/ 02 декабря 2011

collections.defaultdict твой друг.

from collections import defaultdict
temp_dict = defaultdict(set)
for item in data:
   for key, value in item.items():
       temp_dict[key].add(value)

Это дает вам дикт в форме {"key1": ["value1", "value4"]} - если вы хотите, чтобы фактические строки, разделенные запятыми, для значений, вы можете присоединиться к ним:

my_dict = {}
for key, value in temp_dict.items():
    my_dict[key] = ", ".join(value)
3 голосов
/ 02 декабря 2011

Я предположил две вещи здесь - этот порядок значений был для вас не важен, и что вы не хотели иметь два одинаковых ключа в каждом словаре (который я заменил на "key3"):

>>> data = [ {"key1": "value1", "key2": "value2", "key3": "value3"},
...          {"key1": "value4", "key2": "value5", "key3": "value3"},
...          {"key1": "value1", "key2": "value8", "key3": "value3"} ]
>>>
>>> keylist = data[0].keys()
>>> mydata = dict((k,', '.join(set(map(lambda d: d[k], data)))) for k in keylist)
>>> mydata
{'key3': 'value3', 'key2': 'value5, value2, value8', 'key1': 'value4, value1'}
1 голос
/ 02 июня 2015
In [3]: from itertools import chain
In [12]: dict([ (key, ",".join(set([elem[key] for elem in data]))) for key in set(list(chain(*[d.keys() for d in data])))])
Out[12]: {'key1': 'value4,value1', 'key2': 'value5,value2,value8', 'key3': 'value3'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...