2012-04-30 5 views
1

Possible Duplicate:
In Python, how to I iterate over a dictionary in sorted order?Как заказать мой словарь в python?

Мне нужна помощь в словарях. У меня есть два словаря, и я хочу добавить значения идентичных ключей в эти два словаря. Мне нужно составить список суммирования значений, имеющих один и тот же ключ. Я сделал список, но те значения, которые их ключи являются единственными в двух словарях, добавляются после завершения всех вычислений. То, что я имею в виду:

dectionary1= {8: 2, 0: 6, 2: 5, 3: 34} 
dectionary2= {8: 6, 1: 2, 3: 2} 

Мой список должен быть:

summing= [6, 2, 5, 36, 8] 

, так как он будет принимать 0 и проверить, есть ли в dectionary 2 0, а затем он будет принимать 1 (НЕ 2) и проверьте, найден ли он в dectionary 1, чтобы заказать список.

Я получил это до сих пор:

summing=[8, 6, 5, 36, 2] 

Здесь он сначала принимает ключ (8) нет (0) !! Я хочу, чтобы все было в порядке.

Чтобы увидеть мой код, то, что я до сих пор:

dic1= {8: 2, 0: 6, 2: 5, 3: 34} 
dic2= {8: 6, 1: 2, 3: 2} 
p=[] 
for x in dic1: 
    if x in dic2: 
     g=dic1[x]+dic2[x] 
     p=p+[g] 
    else: 
     p=p+[dic1[x]] 
for m in dic2: 
    if m in dic1: 
     p=p 
    else: 
     p=p+[dic2[m]] 

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

Мой питон Wing IDE 3,2

Спасибо

+1

'common_keys = set (dic1.keys()) & set (dic2.keys())'. И элементы dict не сортируются, поэтому у вас нет такой вещи, как «в порядке» для вашего дела. – ThiefMaster

ответ

8

У вас есть два варианта здесь, один является использование collections.OrderedDict(), но я думаю, что проще вариант просто сделать это таким образом:

[dic1.get(x, 0)+dic2.get(x, 0)for x in sorted(dic1.keys() | dic2.keys())] 

Сначала сделаем набор из всех ключей in either of the dictionaries, sort this into the right order, а затем loop over it with a list comprehension, добавив два значения (or 0 if the value doesn't already exist).

>>> dic1= {8: 2, 0: 6, 2: 5, 3: 34} 
>>> dic2= {8: 6, 1: 2, 3: 2} 
>>> [dic1.get(x, 0)+dic2.get(x, 0)for x in sorted(dic1.keys() | dic2.keys())] 
[6, 2, 5, 36, 8] 

Обратите внимание, что это работает только в 3.x, где dict.keys() возвращающего set-like dictionary view. Если вы хотите сделать это в python 2.7.x, вместо этого используйте dict.viewkeys(), раньше, чем set(dict.iterkeys()).

+0

Пожалуйста, дважды проверьте синтаксис. Raise 'TypeError: неподдерживаемый тип операндов для |: 'list' и 'list'' (даже с пробелом между') 'и' for') в Python 2.7.x –

+0

Должно быть '[dic1.get (x, 0) + dic2.get (x, 0) для x в отсортированном (set (dic1.keys()) | set (dic2.keys()))] ' –

+0

в python3,' [dic1.get (x, 0) + dic2.get (x, 0) для x в отсортированном (dic1.keys() | dic2.keys())] 'тоже должен работать (нет необходимости в' set() ') – ch3ka

Смежные вопросы