31

我有一个看起来像的元组列表:

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

检查该元组中是否存在值的最佳方法是什么?例如,我希望能够说:

'apple' in CODES

并得到真

4

2 回答 2

59

您正在寻找any()

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

结合一个简单的生成器表达式,这可以完成任务。生成器表达式接受每个元组,True如果它是 contains 则产生'apple'any()然后True在它请求的第一个项目返回时返回True(否则,False)。因此,这可以满足您的需求。它也很好读 -如果任何元组包含'apple'.

如果您要多次执行此操作并且需要性能,那么可能值得制作一组所有值以允许您非常快速地执行此操作:

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

自然地,构建它会很慢并且会占用内存,因此除非您需要大量性能并且会进行大量成员资格检查,否则这不是一个好主意。

于 2013-02-27T23:48:44.043 回答
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

对于性能比较,您可以查看我的其他答案

于 2013-02-27T23:49:10.030 回答