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

9-b*_*its 29 python list

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

CODES = (
    ('apple', 'reddelicious'),
    ('caramel', 'sweetsticky'),
    ('banana', 'yellowfruit'),
)
Run Code Online (Sandbox Code Playgroud)

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

'apple' in CODES
Run Code Online (Sandbox Code Playgroud)

并得到真实

Gar*_*tty 49

您正在寻找any():

if any('apple' in code for code in CODES):
    ...
Run Code Online (Sandbox Code Playgroud)

结合简单的生成器表达式,这就完成了任务.生成器表达式获取每个元组,True如果它包含则生成'apple'.any()然后True在它请求的第一个项返回时返回True(否则,False).因此,这就做你想要的.它也很好地读取 - 如果任何元组包含'apple'.

如果你这么做很多次并且需要性能,那么可能需要制作一组所有值来让你快速完成这项工作:

cache = set(itertools.chain.from_iterable(CODES)))
Run Code Online (Sandbox Code Playgroud)

当然,构建它会很慢并且使用内存,所以除非你需要大量的性能并且会进行大量的成员检查,否则这不是一个好主意.

  • 在这种情况下,你使用的是错误的数据结构,使用`dict`,然后只需要`CODES ["apple"]`(并且如果它不存在则捕获`KeyError`). (4认同)

Ash*_*ary 7

你可以使用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
Run Code Online (Sandbox Code Playgroud)

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

  • +1,这是一种合理的方法 - 我不确定它如何比较性能.虽然你应该使用`chain.from_iterable()`over`chain(*)`. (2认同)