1

嗨,如果我想用通用值做一些事情而不是仅仅更新它们怎么办。例如,假设值是一个字符串,我想在它们之间放置一个简单的制表符

a={'car':'ferrari','color':'red','driver':'M'} 
b={'car':'lamborghini','color':'yellow','transmission':'manual'}

这样的结果是,

merge_ab={'car':'ferrari\tlamborghini','color':'red\tyellow','driver':'M\t','transmission':'\tmanual'}
4

4 回答 4

3

这是一个很好的 Pythonic 方法:

dicts = [a, b]
allKeys = set(k for d in dicts for k in d.iterkeys())
makeValue = lambda k: '\t'.join(d.get(k, '') for d in dicts) # Make merged value for a given key
merged = dict((k,makeValue(k)) for k in allKeys)
于 2013-10-21T17:12:05.697 回答
2

您可以先合并 dicts,然后分别处理公共键:

merge_ab = dict(a, **b)
for key in set(a) & set(b):
    merge_ab[key] = '{0}\t{1}'.format(a[key], b[key])

如果您使用的是 Python 2.7,则可以使用更高效a.viewkeys() & b.viewkeys()的而不是set(a) & set(b).

于 2013-10-21T16:54:57.607 回答
1

试试这个,它将在 Python 2.x 中工作:

{ k:a.get(k, '') + '\t' + b.get(k, '') for k in set(a.keys() + b.keys()) }

=> {'color': 'red\tyellow', 'car': 'ferrari\tlamborghini',
    'driver': 'M\t', 'transmission': '\tmanual'}

如果您想使用迭代器,请在 Python 2.x 中执行此操作:

import itertools as it
{k:a.get(k,'')+'\t'+b.get(k,'') for k in set(it.chain(a.iterkeys(),b.iterkeys()))}

等效地,在 Python 3.x 中执行此操作:

{ k:a.get(k,'') + '\t' + b.get(k,'') for k in set(it.chain(a.keys(), b.keys())) }
于 2013-10-21T16:55:00.307 回答
0

像这样的东西?请注意,这会修改b可能不是您想要的字典;如果您想创建一个新字典,那么只需分配一个:c={ }并将项目排序到其中。

>>> a={'car':'ferrari','color':'red','driver':'M'}
>>> b={'car':'lamborghini','color':'yellow','transmission':'manual'}
>>> for k, v in a.items() : # Iterate over all key, item pairs of the a dictionary.
...     if k in b : # If a given key exists in the b dictionary as well, then...
...         b[k] += "\\" + v # ...merge the two items.
...     else : # Else, if the given key does not exist in the b dictionary, then...
...         b[k] = v # ...add it.
... 
>>> b
{'color': 'yellow\\red', 'car': 'lamborghini\\ferrari', 'transmission': 'manual', 'driver': 'M'}
于 2013-10-21T16:58:57.663 回答