2012-07-03 53 views
3

我有两个字典包含相同的键,但值对是不同的。让我们让dictA和dictB代表所涉及的两个字典。用Python字典理解重构

dictA = {'key1':'Joe', 'key2':'Bob'} 
dictB = {'key1':'Smith', 'key2':'Johnson'} 

目前,我正在通过嵌套if语句创建基于常见发生键的新字典。这样做时,共享密钥的值将包含在新字典中的列表中。请参阅以下内容:

dictAB = {} # Create a new dictionary 

# Create a list container for dictionary values 
for key in dictA.keys(): 
    dictAB[key] = [] 

# Iterate through keys in both dictionaries 
# Find matching keys and append the respective values to the list container 
for key, value in dictA.iteritems(): 
    for key2, value2 in dictB.iteritems(): 
     if key == key2: 
      dictAB[key].append(value) 
      dictAB[key].append(value2) 
     else: 
      pass 

如何使用python字典理解功能将其变成更干净的结构?

回答

8

使用装置或key views (python 2.7)

dictAB = {k: [dictA[k], dictB[k]] for k in dictA.viewkeys() & dictB.viewkeys()} 

之前2.7:

dictAB = dict((k, [dictA[k], dictB[k]]) for k in set(dictA) & set(dictB)) 

在Python 3,你可以直接用这种行动的.keys方法,因为它们的意见实施:

dictAB = {k: [dictA[k], dictB[k]] for k in dictA.keys() & dictB.keys()} 

Demo(python 2.7):

>>> dictA = {'key1':'Joe', 'key2':'Bob'} 
>>> dictB = {'key1':'Smith', 'key2':'Johnson'} 
>>> dictAB = {k: [dictA[k], dictB[k]] for k in dictA.viewkeys() & dictB.viewkeys()} 
>>> print dictAB 
{'key2': ['Bob', 'Johnson'], 'key1': ['Joe', 'Smith']} 

&运算符在两个集合或字典视图上创建两个集合的交集;所有在两组中都存在的密钥。

通过使用键的交集,即使dictA或dictB具有不出现在其他字典中的键,此代码也可以工作。如果你有绝对把握的密钥将总是一致的,你可以只遍历要么字典的情况下直接交集:

dictAB = {k: [dictA[k], dictB[k]] for k in dictA} 
+1

由于'dictA'和'dictB'按键相同,无论如何,这是没有必要构建交集。一个简单的'for dictA'就可以做到这一点。 –

+0

@SvenMarnach:真够了;我倾向于防守编码。 –

+1

为了防守,我添加了一个调试断言:'assert dictA.viewkeys()== dictB.viewkeys()'。这样,生产代码的速度不受影响。 –

0
dictAB = { key: [dictA[key],dictB[key]] for key in dictA if key in dictB }