我做了一些谷歌搜索如何检查字符串是否包含列表中的任何元素,我发现这段代码有效:
if any(i in string for i in list):
我知道这有效,但我不知道为什么。你能分享一些见解吗?
答案 0 :(得分:6)
正如any
的文档所说:
如果 iterable 的任何元素为true,则返回
class NotifClass { public: NotifClass(const std::shared_ptr<MyEvent>& event): _event(event), _notif_handle(register_for_notif(my_notif_callback, (void*)new std::weak_ptr<MyEvent>(event))) // initialize some other stuff { // Initialize some more stuff } ~NotifClass() { unregister_for_notif(_notif_handle); } static void my_notif_callback(void* context) { auto ptr = ((std::weak_ptr<MyEvent>*)context)->lock(); // If destructed, do not set the event. if (!ptr) { return; } ptr->set_event(); } private: std::shared_ptr<MyEvent> _event; NOTIF_HANDLE _notif_handle; };
。如果 iterable 为空,则返回True
。相当于:
False
所以,这相当于:
def any(iterable):
for element in iterable:
if element:
return True
return False
......这本身就等同于:
for element in (i in string for i in list):
if element:
return True
return False
如果您不理解最后一部分,请先阅读list comprehensions上的教程部分,然后跳到iterators,生成器和生成器表达式。
如果你想真正分解它,你可以这样做:
for i in list:
element = i in string
if element:
return True
return False
这仍然不完全相同,因为生成器表达式构建了一个生成器,而不是列表,但它应该足以让你继续阅读教程部分。
但与此同时,拥有elements = []
for i in list:
elements.append(i in string)
for element in elements:
if element:
return True
return False
和理解等等的观点是,你几乎可以用简单的英语阅读它们:
any
答案 1 :(得分:2)
public class NaturalNumber {
private Integer n;
public NaturalNumber(Integer n) { this.n = n; }
public boolean isEven() {
return n.intValue() % 2 == 0;
}
// ...
}
这会生成一个可迭代的布尔值,表明i in string for i in list
中的每个项目是否都在list
中。然后检查此可迭代bools中的任何项是否为真。
实际上,您需要检查列表中的任何项目是否为string
的子字符串。
答案 2 :(得分:1)
这里发生了什么:
if any(i in string for i in list):
最好通过说明来解释:
>>> xs = ["Goodbye", "Foo", "Balloon"]
>>> s = "Goodbye World"
>>> [i in s for i in xs]
[True, False, False]
>>> any([i in s for i in xs])
True
如果您阅读any
文档,请注意:
any(iterable)
如果iterable的任何元素为true,则返回True。 如果iterable为空,则返回False。相当于:
列表理解应该更加明显,因为它为i in s
的每个元素构建了xs
列表。
基本上( in English )您将返回搜索字符串中每个子字符串存在的任何匹配项( haystack )。
同样重要的是要注意any()
将短路并在它找到的第一个True
( ish )值上结束。 any()
可以在纯Python中实现,如下所示:
def any(iterable):
for x in iterable:
if x:
return True
return False