【问题标题】:Pythonic way to check for membership and get member检查成员资格并获取成员的 Pythonic 方式
【发布时间】:2019-07-21 14:23:43
【问题描述】:
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 的项目值?或者还有其他功能吗?

【问题讨论】:

  • 在 Python 3.8 中将有一个海象运算符可以做到这一点。
  • 您正在寻找两个集合的交集。使用if any(...) 是在问一个完全不同的问题,它的答案不是你想要的。

标签: python any


【解决方案1】:

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

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

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


您问题的第二部分似乎提出了一些稍微不同的问题;相当于any() 调用将是:

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

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

【讨论】:

  • 您需要使用O(n) 扫描一次字符串
  • 您有 n 个成员的 O(1) 成员资格测试。
【解决方案2】:
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']

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多