Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按谓词筛选Python列表_Python - Fatal编程技术网

按谓词筛选Python列表

按谓词筛选Python列表,python,Python,我想做一些类似的事情: >>> lst = [1, 2, 3, 4, 5] >>> lst.find(lambda x: x % 2 == 0) 2 >>> lst.findall(lambda x: x % 2 == 0) [2, 4] Python的标准库中是否有类似的行为 我知道在这里很容易实现自己的滚动,但我正在寻找一种更标准的方法。您可以使用过滤方法: >>> lst = [1, 2, 3, 4, 5] >

我想做一些类似的事情:

>>> lst = [1, 2, 3, 4, 5]
>>> lst.find(lambda x: x % 2 == 0)
2
>>> lst.findall(lambda x: x % 2 == 0)
[2, 4]
Python的标准库中是否有类似的行为


我知道在这里很容易实现自己的滚动,但我正在寻找一种更标准的方法。

您可以使用过滤方法:

>>> lst = [1, 2, 3, 4, 5]
>>> filter(lambda x: x % 2 == 0, lst)
[2, 4]
或列表:

>>> lst = [1, 2, 3, 4, 5]
>>> [x for x in lst if x %2 == 0]
[2, 4]
要查找单个元素,您可以尝试:

>>> next(x for x in lst if x % 2 == 0)
2
虽然如果没有匹配项,则会抛出异常,因此您可能希望将其包装为try/catch。括号()使其成为生成器表达式,而不是列表

就我个人而言,我只是使用常规的筛选/理解,并采用第一个元素(如果有)

如果未找到任何内容,则会引发异常

filter(lambda x: x % 2 == 0, lst)[0]
[x for x in lst if x %2 == 0][0]
这些返回空列表

filter(lambda x: x % 2 == 0, lst)[:1]
[x for x in lst if x %2 == 0][:1]

生成器和列表理解比可链接函数更具python风格

>lst=[i代表范围(1,6)中的i]
>>>lst
[1, 2, 3, 4, 5]
>>>gen=(如果x%10==0,则lst中的x代表x)
>>>下一个(gen,“未找到”)
“没有找到”
>>>[x代表x在gen中]
[]
例如,我有时会这样使用它:

>>n=next(如果x%10==0,则lst中的x代表x),无)
>>>如果n为无:
...     打印('未找到')
... 
找不到
否则,您可以这样定义实用程序函数OneLiner:

>>find=lambda-fun,lst:next(如果fun(x)表示lst中的x),无)
>>>查找(λx:x%10==0,lst)
>>>查找(λx:x%5==0,lst)
5.
>>>findall=lambda fun,lst:[x表示在lst中的x,如果fun(x)]
>>>findall(λx:x%5==0,lst)
[5]

除了生成器理解,您还可以使用itertools.ifilter(func,list).next(),它更接近所需的语法。您还可以使用itertools.dropwhile(lambda x:not func(x),list),如果列表中不包含满足谓词的元素,则不会引发异常。它还有一个优点,即如果所需元素出现在列表末尾之前,它可以短路。综上所述,库中没有适用于此的简单函数。我更喜欢一个简单的for/if或一个自制的实用程序功能。令人惊讶的是,这个功能并不存在。有什么设计原因吗?@AllenWang这主要是由于Guido Van Rossum对Python AFAICT的偏好和风格选择。该语言的创建者并不认为函数式编程可以为Python提供很多东西(c.f.:)。