我知道这是在python 2中与2个字典相交的一种非常有效的方法
filter(dict_1.has_key, dict_2.keys())
但是has_key()
已从Python3中删除,所以我不能真正使用快速的filter()
和has_key()
函数。我现在正在做的是:
[key for key in dict_2 if key in dict_1]
但是,除了可读性不强之外,它似乎有点过时。这真的是python3的新最快方法,还是使用filter()
有更快,更干净的方法?
答案 0 :(得分:5)
当您想要按键的交集时,您可以这样做:
d1 = {1 : 1, 2 : 2}
d2 = {1 : 3, 2 : 4, 3 : 5}
common = list(d1.keys() & d2.keys())
print(common)
输出
[1, 2]
答案 1 :(得分:5)
您可以在Python 3.x中使用has_key
运算符,而不是Python 2中的in
。使用filter
(在3.x中提供了一个惰性迭代器),您可以使用dict.__contains__
。也无需致电dict.keys
:
res = filter(dict_1.__contains__, dict_2) # lazy
print(list(res))
# [2, 3]
一种等效的但不太美观的基于lambda
的解决方案:
res = filter(lambda x: x in dict_1, dict_2) # lazy
生成器表达式是第三种选择:
res = (x for x in dict_2 if ix in dict_1) # lazy
对于非惰性方法,可以使用set.intersection
(或其语法糖&
):
res = set(dict_1) & set(dict_2) # {2, 3}