0

I have two dictionaries:

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']}

I need to produce such 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'],
....
}

So I need to collect all items from lists with same keys, but I need to save first order.

Dictionaries always have same keys

I have try to do this with zip but I`m getting total mess

user3919096
  • 71
  • 1
  • 8

3 Answers3

0

Why not just iterating over the dictionaries and copy them to a new dictionary? A defaultdict is used in the following code for simplicity :

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)

If the keys are the same, you can copy the first dictionary and update its content :

d = a.copy()

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

Note that the latter creates a shallow copy and therefore the dictionary a is also modified during the process.

Danstahr
  • 4,190
  • 22
  • 38
0

If you want alphabetical order, use an OrderedDict and sort the keys:

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'])])
Padraic Cunningham
  • 176,452
  • 29
  • 245
  • 321
0

How about using OrderedDict with a tuple list to set initial order. and then simply maintaining it.

Check my answer here for nicer dict syntax: 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]
Community
  • 1
  • 1
Or Weis
  • 524
  • 5
  • 5
  • how is this different from my answer posted a couple of hours before yours except for the fact the output does not match the OP's expected? – Padraic Cunningham Sep 29 '14 at 13:03