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']
是你的第一个循环的列表理解等价物。
你想用第二个循环做什么。似乎您已经切换了字符串和列表。这个表达对我来说再清楚不过了。
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']
是你的第一个循环的列表理解等价物。
你想用第二个循环做什么。似乎您已经切换了字符串和列表。这个表达对我来说再清楚不过了。