检查所有值是否存在为词典中的键

时间:2018-06-06 16:04:45

标签: python

我有一个值列表和一个字典。我想确保列表中的每个值都作为字典中的键存在。目前,我使用两套来判断词典中是否存在任何值

unmapped = set(foo) - set(bar.keys())

是否有更多的pythonic方法来测试这个?感觉有点像黑客?

2 个答案:

答案 0 :(得分:2)

您的方法可行,但转换为set会产生费用。

具有相同时间复杂度的另一种解决方案是:

all(i in bar for i in foo)

这两个都有时间复杂度O(len(foo))

bar = {str(i): i for i in range(100000)}
foo = [str(i) for i in range(1, 10000, 2)]

%timeit all(i in bar for i in foo)
462 µs ± 14.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit set(foo) - set(bar)
14.6 ms ± 174 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# The overhead is all the difference here:

foo = set(foo)
bar = set(bar)

%timeit foo - bar
213 µs ± 1.48 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

这里的开销有很大的不同,所以我会在这里选择all

答案 1 :(得分:1)

尝试此操作以查看是否存在任何未映射的项目:

has_unmapped = all( (x in bar) for x in foo   )

要查看未映射的项目:

unmapped_items = [ x for x in foo if x not in bar ]