在filter()中使用has_key()的最快方法?

时间:2019-01-08 09:46:02

标签: python python-3.x dictionary

我知道这是在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()有更快,更干净的方法?

2 个答案:

答案 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}