Python中的序列查找功能

Sal*_*lil 27 python find sequence

如何在满足特定标准的序列中找到对象?

列表理解和过滤器遍历整个列表.是手工制作的唯一选择吗?

mylist = [10, 2, 20, 5, 50]
find(mylist, lambda x:x>10) # Returns 20
Run Code Online (Sandbox Code Playgroud)

Sin*_*ion 35

这是我使用的模式:

mylist = [10, 2, 20, 5, 50]
found = next(i for i in mylist if predicate(i))
Run Code Online (Sandbox Code Playgroud)

或者,在Python 2.4/2.5中,next()不是内置的:

found = (i for i in mylist if predicate(i)).next()
Run Code Online (Sandbox Code Playgroud)

请注意,如果未找到任何元素,则会next()引发提升StopIteration.在大多数情况下,这可能是好的.你问了第一个元素,没有这样的元素,所以程序可能无法继续.

另一方面,如果您确实知道在这种情况下该怎么做,您可以提供默认值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')
Run Code Online (Sandbox Code Playgroud)


Jer*_*iah 11

实际上,至少在Python 3中,过滤器不会遍历整个列表.

要仔细检查:

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

var = next(filter(test_it, range(20)))
Run Code Online (Sandbox Code Playgroud)

在Python 3.2中,打印出0-11,并将var指定为11.

在2.x版本的Python中,您可能需要使用itertools.ifilter.


ber*_*nie 5

如果你只想要第一个大于10,你可以使用itertools.ifilter:

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

如果你想要大于10,那么使用列表理解可能是最简单的:

all_gt10 = [i for i in mylist if i > 10]
Run Code Online (Sandbox Code Playgroud)