1

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

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

    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}

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

4

2 回答 2

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}
于 2012-10-16T16:31:10.250 回答
2

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

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)}
于 2012-10-16T16:52:47.700 回答