Python: сокращение списка в словаре

Я надеюсь, что это будет легко. У меня есть словарь:

{ 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, { 'key1': 'value4', 'key2': 'value5', 'key3': '******' },

Как я могу уменьшить это, чтобы быть следующим:

{ 'key1': ['value1', 'value4'], 'key2': ['value2', 'value5'], 'key3': ['value3', '******'] }

Большое спасибо!

4 ответа

Как это:

from collections import defaultdict
d1 = { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }
d2 = { 'key1': 'value4', 'key2': 'value5', 'key3': '******' }
dout = defaultdict(list)
for item in d1: dout[item].append(d1[item])
for item in d2: dout[item].append(d2[item])
print dout


Это работает для случая двух dicts с теми же ключами:

a = { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3'
}
b = {
'key1': 'value4',
'key2': 'value5',
'key3': '******'
}
c= {k: [a[k], b[k]] for k in a.keys()}


Преобразовать список dicts в dict со списком значений

from itertools import chain
result = {}
data = [ {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, {'key1': 'value4', 'key2': 'value5', 'key3': '******'},
]
list_of_tuples = chain(*[x.items() for x in data])
for k, v in list_of_tuples: result.setdefault(k, []).append(v)
print(result)

Вывод:

> python app.py
{'key3': ['value3', '******'], 'key2': ['value2', 'value5'], 'key1': ['value1', 'value4']}


Вот так -

vals = [{ 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, { 'key1': 'value4', 'key2': 'value5', 'key3': '******' }]
d = {}
for k,v in [(k,v) for item in vals for k,v in item.items()]: d[k] = d[k] + [v] if d.get(k) else [v]
#>>> d
#{'key3': ['value3', '******'], 'key2': ['value2', 'value5'], 'key1': ['value1', 'value4']}

licensed under cc by-sa 3.0 with attribution.