Pythonic 方式来检查成员资格并获得成员资格

Pythonic way to check for membership and get member

a_set = {'a', 'b', 'c'}
word = 'foobar'
for item in a_set:
  if item in word:
    print(item)

我想让下面的代码做上面代码做的事情

if any(item in lst for item in word):
  # print(item)

我更喜欢这种语法,因为它更易于阅读。但是有没有办法检索在 any() 中返回 True 的项目值?或者还有其他功能吗?

您可以使用 set.intersection,它还具有 O(1) 成员资格测试* 与线性 O(N) 扫描字符串的良好效果:

>>> a_set = {'a', 'b', 'c'}
>>> word = 'foobar'
>>> a_set.intersection(word)
{'a', 'b'}

*具体来说,调用 a_set.intersection(word) 仍然需要对 word 进行 once-over O(N) 扫描,以便在内部将其转换为 set .但是,从那时起每次检查都是 O(1)(对于 a_set 的每个成员)。您可以将其与问题中的代码段进行对比,其中每个单独的检查都是 O(N)。


你的问题的第二部分似乎在问一些稍微不同的东西; any() 调用的等效项是:

>>> if a_set.intersection(word):
...     # do something

如果交集包含 1 个或多个元素,条件将测试 True

In [85]: a_set = {'a', 'b', 'c'} 
    ...: word = 'foobar'                                                                                     
In [86]: [item for item in a_set if item in word]                                                            
Out[86]: ['b', 'a']

是你的第一个循环的列表理解等价物。

你想用第二个循环做什么。似乎您已经切换了字符串和列表。这个表达对我来说再清楚不过了。