检查元素是否在元组的元组中存在

32 投票
2 回答
36894 浏览
提问于 2025-04-17 17:23

我有一个包含元组的列表,长得像这样:

CODES = (
    ('apple', 'reddelicious'),
    ('caramel', 'sweetsticky'),
    ('banana', 'yellowfruit'),
)

我想知道检查一个值是否在这个元组里最好的方法是什么?比如我想能这样说:

'apple' in CODES

然后得到 True。

2 个回答

9

你可以使用 itertools.chain() 这个工具:

把它和 in 一起用时,会像 any() 一样快速停止查找。

In [30]: CODES = (
   ....:     ('apple', 'reddelicious'),
   ....:     ('caramel', 'sweetsticky'),
   ....:     ('banana', 'yellowfruit'),
   ....: )


In [31]: from itertools import chain

In [32]: 'apple' in chain(*CODES)
Out[32]: True

In [33]: 'foo' in chain(*CODES)
Out[33]: False

如果你想了解 性能比较,可以看看我在这里的 其他回答

60

你可以看看 any() 这个函数:

if any('apple' in code for code in CODES):
    ...

结合一个简单的 生成器表达式,就能完成这个任务。这个生成器表达式会检查每个元组,如果里面有 'apple',就返回 True。然后 any() 会在它请求的第一个项目返回 True 时就返回 True(如果没有找到,就返回 False)。所以这样就能实现你想要的效果。而且读起来也很顺畅——如果任何一个元组包含 'apple'

如果你要做这个操作很多次,并且对性能有要求,那么可以考虑先把所有的值放到一个集合里,这样可以很快地进行检查:

cache = set(itertools.chain.from_iterable(CODES)))

当然,构建这个集合会比较慢,并且会占用内存,所以如果你不需要很高的性能或者不需要做很多的成员检查,那就不太划算。

撰写回答