Python:在两个dicts之间匹配键和值的最快方法

时间:2014-03-20 04:44:19

标签: python

除了迭代每个字典和匹配之外,还有什么方法可以实现这个目标吗? 主要是问这个问题,看看是否有一些有效的方法来做这个而不是循环。也许在itertools模块中有一些功能可以做到这一点,我不知道?有点像拉链? izip?

dict1:

{'command': ('aks',), 'variants': ('common',), 'name': 'oop', 'imports': ('abc', 'efg')}

dict2:

{'exports': <type 'dict'>, 'serialize': <type 'bool'>, 'force': <type 'bool'>, 'name': <type 'str'>, 'build_host': <type 'str'>, 'imports': <type 'list'>, 'logfile_timeout': <type 'int'>, 'update': 'skip_check', 'by_variant': <type 'list'>, 'command': <type 'list'>, 'signature': <type 'str'>, 'variants': 'skip_check'}

期望的结果: 在两个dict中列举或同义相同键的值

commands:
(('aks',), <type 'list'>)
variants:
(('common',), 'skip_check')
name:
('oop', <type 'str'>)
imports:
(('abc', 'efg'),<type 'list'>)

2 个答案:

答案 0 :(得分:3)

我不完全确定你究竟在寻找什么,但这是我能做的最好的事情:

keys = d1.viewkeys() & d2
print zip(map(d1.get, keys), map(d2.get, keys))

<强>输出

[(('abc', 'efg'), <type 'list'>),
 (('common',), 'skip_check'),
 (('aks',), <type 'list'>),
 ('oop', <type 'str'>)]

注意:这假设d1中的密钥都出现在d2中。

答案 1 :(得分:2)

此解决方案适用于大多数Python版本,而dict.viewkeys仅适用于Python 2.7(不是2.6,也不是3,您必须替换dict.keys):

dict1 = {'command': ('aks',), 'variants': ('common',), 'name': 'oop', 'imports': ('abc', 'efg')}
dict2 =  {'exports': dict, 'serialize': bool, 'force': bool, 'name': str, 'build_host': str, 'imports': list, 'logfile_timeout': int, 'update': 'skip_check', 'by_variant': list, 'command': list, 'signature': str, 'variants': 'skip_check'}
for key in set(dict1).intersection(dict2):
    print(key + ':')
    print(dict1[key], dict2[key])

打印:

imports:
(('abc', 'efg'), <type 'list'>)
variants:
(('common',), 'skip_check')
command:
(('aks',), <type 'list'>)
name:
('oop', <type 'str'>)

您可能想要的是将字符串中的键的交集分组:

intersect_dict= dict((key, [d[key] for d in (dict1, dict2)]) 
                                   for key in set(dict1).intersection(dict2))

import pprint
pprint.pprint(intersect_dict)

打印:

{'command': [('aks',), <type 'list'>],
 'imports': [('abc', 'efg'), <type 'list'>],
 'name': ['oop', <type 'str'>],
 'variants': [('common',), 'skip_check']}