2014-09-29 3 views
0

У меня есть два словаря:Объединение двух словарей с сохранением порядка

a = {u'Anthracite': [u'3/optimized/8593793_fpx.tif'], 
u'Black': [u'6/optimized/8593796_fpx.tif'], 
u'Cobalt': [u'9/optimized/8593799_fpx.tif'], 
u'Fire': [u'2/optimized/8593802_fpx.tif'], 
u'Fuschia': [u'5/optimized/8593805_fpx.tif'], 
u'Iris': [u'8/optimized/8593808_fpx.tif'], 
u'Midnight': [u'1/optimized/8593811_fpx.tif']} 

b = {u'Anthracite': [u'5/optimized/8593795_fpx.tif'], 
u'Black': [u'8/optimized/8593798_fpx.tif'], 
u'Cobalt': [u'1/optimized/8593801_fpx.tif'], 
u'Fire': [u'4/optimized/8593804_fpx.tif'], 
u'Fuschia': [u'7/optimized/8593807_fpx.tif'], 
u'Iris': [u'0/optimized/8593810_fpx.tif'], 
u'Midnight': [u'3/optimized/8593813_fpx.tif']} 

Мне нужно производить такие Dict:

c = {u'Anthracite': [u'3/optimized/8593793_fpx.tif', u'5/optimized/8593795_fpx.tif'], 
u'Black': [u'6/optimized/8593796_fpx.tif', u'8/optimized/8593798_fpx.tif'], 
.... 
} 

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

Словари всегда имеют одинаковые ключи

Я пытаюсь сделать это с молнией, но I`m получать полный беспорядок

+0

И как же вы намерены делать? Вы уже писали код для этого? У словарей всегда есть одинаковые ключи? – filmor

+0

@filmor У меня есть обновленный вопрос, да, ключи всегда одинаковые – user3919096

+0

Показать ваш код, пожалуйста. – filmor

ответ

0

Почему не просто итерация словарей и скопировать их в новый словарь? Defaultdict используется в следующем коде для простоты:

from collections import defaultdict 
c = defaultdict(list) 
a = {"foo": ["bar"]} 
b = {"foo": ["baz"], "bah": ["foo"]} 
for k, v in a.items() + b.items(): 
    c[k].extend(v) 

Если ключи одинаковы, вы можете скопировать первый словарь и обновлять его содержание:

d = a.copy() 

for k, v in b.iteritems(): 
    d[k].extend(v) 

Обратите внимание, что последний создает неглубокий копия, и поэтому словарь a также модифицируется во время процесса.

0

Если вы хотите алфавитный порядок, используйте OrderedDict и sort ключи:

from collections import OrderedDict 
srt_keys = sorted(a.keys()) 

d = OrderedDict() 
for k in srt_keys: 
    d[k] = a[k] 
    d[k] += b[k] 
print d 

OrderedDict([(u'Anthracite', [u'3/optimized/8593793_fpx.tif', u'5/optimized/8593795_fpx.tif']), (u'Black', [u'6/optimized/8593796_fpx.tif', u'8/optimized/8593798_fpx.tif']), (u'Cobalt', [u'9/optimized/8593799_fpx.tif', u'1/optimized/8593801_fpx.tif']), (u'Fire', [u'2/optimized/8593802_fpx.tif', u'4/optimized/8593804_fpx.tif']), (u'Fuschia', [u'5/optimized/8593805_fpx.tif', u'7/optimized/8593807_fpx.tif']), (u'Iris', [u'8/optimized/8593808_fpx.tif', u'0/optimized/8593810_fpx.tif']), (u'Midnight', [u'1/optimized/8593811_fpx.tif', u'3/optimized/8593813_fpx.tif'])]) 
0

Как об использовании OrderedDict список кортежей, чтобы установить первоначальный заказ. а затем просто поддерживая его.

Проверьте мой ответ здесь для более хорошего синтаксиса Dict: Override the {...} notation so i get an OrderedDict() instead of a dict()?

from collections import OrderedDict 

#Use an ordered dict, with a tuple list init to maintain initial order 
a = OrderedDict([ 
     (u'Anthracite', [u'3/optimized/8593793_fpx.tif']), 
     (u'Black', [u'6/optimized/8593796_fpx.tif']), 
     (u'Cobalt', [u'9/optimized/8593799_fpx.tif']), 
     (u'Fire', [u'2/optimized/8593802_fpx.tif']), 
     (u'Fuschia', [u'5/optimized/8593805_fpx.tif']), 
     (u'Iris', [u'8/optimized/8593808_fpx.tif']), 
     (u'Midnight', [u'1/optimized/8593811_fpx.tif']) 
     ]) 

#We don't care about b's order 
b = {u'Anthracite': [u'5/optimized/8593795_fpx.tif'], 
u'Black': [u'8/optimized/8593798_fpx.tif'], 
u'Cobalt': [u'1/optimized/8593801_fpx.tif'], 
u'Fire': [u'4/optimized/8593804_fpx.tif'], 
u'Fuschia': [u'7/optimized/8593807_fpx.tif'], 
u'Iris': [u'0/optimized/8593810_fpx.tif'], 
u'Midnight': [u'3/optimized/8593813_fpx.tif']} 

merge = OrderedDict() 
#Since b has the same keys as a(we don't need to care for diffrent keys), but we want a's order 
for key in a: 
    #We insert by order to an OrderedDict so the same order will be maintained 
    merge[key] = a[key] + b[key] 
+0

как это отличается от моего ответа, размещенного за пару часов до вашего, за исключением того, что результат не соответствует ожидаемым OP? –

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