Sequence find function in Python

南笙酒味 提交于 2019-12-18 02:02:15

问题


How do I find an object in a sequence satisfying a particular criterion?

List comprehension and filter go through the entire list. Is the only alternative a handmade loop?

mylist = [10, 2, 20, 5, 50]
find(mylist, lambda x:x>10) # Returns 20

回答1:


Here's the pattern I use:

mylist = [10, 2, 20, 5, 50]
found = next(i for i in mylist if predicate(i))

Or, in Python 2.4/2.5, next() is a not a builtin:

found = (i for i in mylist if predicate(i)).next()

Do note that next() raises StopIteration if no element was found. In most cases, that's probably good. You asked for the first element, no such element exists, and so the program probably cannot continue.

If, on the other hand, you do know what to do in that case, you can supply a default to next():

conf_files = ['~/.foorc', '/etc/foorc']
conf_file = next((f for f in conf_files if os.path.exists(f)),
                 '/usr/lib/share/foo.defaults')



回答2:


Actually, in Python 3, at least, filter doesn't go through the entire list.

To double check:

def test_it(x):
    print(x)
    return x>10

var = next(filter(test_it, range(20)))

In Python 3.2, that prints out 0-11, and assigns var to 11.

In 2.x versions of Python you may need to use itertools.ifilter.




回答3:


If you only want the first greater than 10 you can use itertools.ifilter:

import itertools
first_gt10 = itertools.ifilter(lambda x: x>10, [10, 2, 20, 5, 50]).next()

If you want all greater than 10, it may be simplest to use a list-comprehension:

all_gt10 = [i for i in mylist if i > 10]



回答4:


Too lazy to write:

mylist = [10, 2, 20, 5, 50]
max(mylist, key=lambda x: x>10)


来源:https://stackoverflow.com/questions/6039425/sequence-find-function-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!