当前位置:  开发笔记 > 编程语言 > 正文

按谓词过滤Python列表

如何解决《按谓词过滤Python列表》经验,为你挑选了1个好方法。

我想做的事情如下:

>>> lst = [1, 2, 3, 4, 5]
>>> lst.find(lambda x: x % 2 == 0)
2
>>> lst.findall(lambda x: x % 2 == 0)
[2, 4]

在Python的标准库中是否有任何接近这种行为的东西?

我知道在这里滚动你自己很容易,但我正在寻找一种更标准的方式.



1> John Montgom..:

您可以使用过滤方法:

>>> 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]


您还可以使用itertools.dropwhile(lambda x:not func(x),list),如果列表中不包含满足谓词的元素,则不会抛出异常.它还具有如下优点:如果在列表结束之前出现所需元素,则它可能短路.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有