2015-12-13 4 views
2

Если у меня есть несколько словарей, как так:Объединение и заказ словарей в Python

dict1 = {Jamal: 10, Steve: 20} 
dict2 = {Frank: 200, Steve: 30} 
dict3 = {Carl: 14, Jamal: 26} 

Как бы объединить их и порядок их в порядке номеров спускавшихся без перезаписи значений, так что он показывает что-то вроде:

Frank: 200, Steve: 30, Jamal: 26, Steve: 20, Carl: 14, Jamal: 10 

ответ

0

Есть два Steve от dict1, dict2. Типы сопоставления не позволяют дублировать ключи.

Вам необходимо использовать типы последовательностей (например, list, tuple, ..).

>>> dict1 = {'Jamal': 10, 'Steve': 20} 
>>> dict2 = {'Frank': 200, 'Steve': 30} 
>>> dict3 = {'Carl': 14, 'Jamal': 26} 
>>> 
>>> import itertools 
>>> it = itertools.chain.from_iterable(d.items() for d in (dict1, dict2, dict3)) 
>>> ', '.join('{}: {}'.format(*x) for x in sorted(it, key=lambda x: x[1], reverse=True)) 
'Frank: 200, Steve: 30, Jamal: 26, Steve: 20, Carl: 14, Jamal: 10' 
0

Вы не можете создать словарь с повторяющимися ключами, используйте OrderedDict с dict.setdefault способом поставить относительные значения в списке:

dict1 = {'Jamal': 10, 'Steve': 20} 
dict2 = {'Frank': 200, 'Steve': 30} 
dict3 = {'Carl': 14, 'Jamal': 26} 

from collections import OrderedDict 
from itertools import chain 
from operator import itemgetter 
d = OrderedDict() 
for key, value in sorted(chain.from_iterable([dict1.items(),dict2.items(),dict3.items()]), key=itemgetter(1),reverse=True): 
    d.setdefault(key,[]).append(value) 

print d 
OrderedDict([('Frank', [200]), ('Steve', [30, 20]), ('Jamal', [26, 10]), ('Carl', [14])]) 

Или просто сортируется как следующее:

print sorted(chain.from_iterable([dict1.items(),dict2.items(),dict3.items()]), key=itemgetter(1),reverse=True) 


[('Frank', 200), ('Steve', 30), ('Jamal', 26), ('Steve', 20), ('Carl', 14), ('Jamal', 10)] 
Смежные вопросы