Python:将一个字典中的公共密钥应用于另一个字典

时间:2012-10-16 16:24:13

标签: python dictionary

我对字典很新,所以这可能是一个相当基本的问题。

假设我有两个具有相似元素的不同词典。 例如:

    Dictionary1 = {'Bob' : 1, 'Mary' : 2, 'Sue' : 3, 'George' : 4}
    Dictionary2 = {'Bob' : 1, 'Sue' : 2, 'Jill' : 3, 'Isaac' : 4, 'George' : 5}

我希望能够取两个词典的交集并将第一个词典的索引应用到第二个词典。所以我想要一个看起来像这样的输出:

    DictionaryCombo = {'Bob' : 1, 'Sue' : 3, 'George' : 4}

请原谅我的格式化为我想要的输出,因为我不确定它应该是什么样子,虽然我知道我想要两个字典交集的键和值对。

2 个答案:

答案 0 :(得分:4)

如果你想要d1的子集,那么它只有d2中存在的元素

d1 = {'Bob': 1, 'Mary': 2, 'Sue': 3, 'George': 4}
d2 = {'Bob': 101, 'Sue': 102, 'Jill': 103, 'Isaac': 104, 'George': 105}
{k: v for k, v in d1.items() if k in d2}
# {'Bob': 1, 'Sue': 3, 'George': 4}

或者你提到 apply ,所以你想更新d2中的值吗?

d2.update(d1)
print d2
# {'Sue': 3, 'Mary': 2, 'Jill': 103, 'Isaac': 104, 'Bob': 1, 'George': 4}

或者,如果你真的是从两个列表开始(而不是从dict开始):

el1 = ['Bob', 'Mary', 'Sue', 'George']
el2 = ['Bob', 'Sue', 'Jill', 'Isaac', 'George']
dict( (val, idx) for idx, val in enumerate(d1, start=1) if val in set(el2) )
#{'Bob': 1, 'Sue': 3, 'George': 4}

如果您有两个列表,一个键和一个值,并希望将它们设为dict,那么您可以使用zip

keys = ['Bob', 'Mary', 'Sue', 'George']  
vals = [1, 2, 3, 4]
dict( zip(keys, vals) )
# {'Bob': 1, 'Mary': 2, 'Sue': 3, 'George': 4}

答案 1 :(得分:2)

dict.viewkeys()方法提供了一个类似于set的对象,可以轻松找到两个词典(交集)的公共键:

d1 = {'Bob' : 1, 'Mary' : 2, 'Sue' : 3, 'George' : 4}
d2 = {'Bob' : 1, 'Sue' : 2, 'Jill' : 3, 'Isaac' : 4, 'George' : 5}

common_keys = d1.viewkeys() & d2.viewkeys()
dict_with_d1_values = {k: d1[k] for k in common_keys}
# -> {'Bob': 1, 'George': 4, 'Sue': 3}

或者如果您确实需要两个值:

dict_with_combined_values = {k: (d1[k], d2[k]) for k in common_keys}
# -> {'Bob': (1, 1), 'George': (4, 5), 'Sue': (3, 2)}