2014-09-29 31 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']} 

我需要产生这样的字典:

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

所以我需要从相同的密钥列表中收集的所有项目,但我需要保存第一顺序。

字典总是有相同的密钥

我已经尝试用拉链做到这一点,但我真的变得一团糟

+0

你如何打算这样做?你有没有为此编写代码?字典是否总是有相同的密钥? – filmor 2014-09-29 09:05:42

+0

@filmor我有更新的问题,是的键总是相同的 – user3919096 2014-09-29 09:10:26

+0

请显示您的代码。 – filmor 2014-09-29 09:11:55

回答

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

如果你想按字母顺序排列,使用OrderedDictsort键:

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有一个元组列表设置初始订单。然后简单地维护它。

这里查看我的回答对更好的字典语法: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的预期不符之外,这与我的回答发布之前的几小时有何不同? – 2014-09-29 13:03:38