Python:从末尾遍历列表以查找满足条件的第一个元素

时间:2015-07-24 16:33:35

标签: python python-2.7 listiterator

我想迭代列表末尾的元素,以找到包含'}'的元素最后一次出现的索引。

理想情况下,我希望使用迭代器来保持效率,而不是实际反转整个列表或搜索符合此条件的所有匹配项。

如果我找到第一次出现,我会使用:

next(i for i,x in enumerate(list) if '}' in x)

但是,我尝试使用reverse来创建一个反向迭代器,但这似乎不起作用,大概是因为枚举没有处理迭代器,或者我可能误解了......

next(i for i,x in enumerate(reversed(list)) if '}' in x)

我知道其他方法是:

[i for i,x in enumerate(list) if '}' in x][-1]

或:

next(i for i,x in enumerate(list[::-1]) if '}' in x)

但是,我正在寻找最有效的方法。我当然可以编写一个效率循环,但是想知道是否有一种使用可用功能的简洁方法。

我对Python比较陌生,所以对我很轻松,如果我误解了任何内容,请告诉我。我使用的是Python 2.7。

提前致谢。

5 个答案:

答案 0 :(得分:2)

你的例子

next(i for i,x in enumerate(reversed(lst)) if '}' in x)

有效,但它会返回颠倒列表的索引。因此,如果它在(未反转的)列表的最后一个字符串中找到'}',它将返回0.

所以要在原始的,未反转的列表中获取索引

len(lst) - 1 - next(i for i,x in enumerate(reversed(lst)) if '}' in x)

如果在StopIteration中找不到'}',则上述代码会引发lst。你可以通过

来避免这种情况
len(lst) - 1 - next((i for i,x in enumerate(reversed(lst)) if '}' in x), len(lst))

和(就像Kupiakos的代码一样)如果找不到'}',它将返回-1。

顺便说一句,不要使用list作为变量名称(即使在示例代码中),因为它会影响内置的list类型。

答案 1 :(得分:2)

{{1}}

答案 2 :(得分:0)

查找列表中项目的最大索引的代码:

mylist = [10, 1, 2, 3, 10, 3]
max_index=max([i for i, j in enumerate(mylist) if j==10])
max_index

输出:4

你可以看到索引10是4,python索引从零开始。欢呼声。

答案 3 :(得分:0)

使用itertools.ifilter()应该是有效的:

from itertools import ifilter

def rsearch(lst, condition):
    try:
        return (len(lst) - next(ifilter(lambda t: condition(t[1]),
                                        enumerate(reversed(lst), 1)))[0])
    except StopIteration:
        return None  # nothing satisfied condition

lst = ['{b}', '[c]', '{a}', 'g']

print(rsearch(lst, lambda s: '}' in s))  # -> 2

答案 4 :(得分:0)

这似乎在 time 中与生成器表达式相当。

a = map(str, xrange(1000000))
a[2000] = 'a'

def f(a):
    for i,n in enumerate(reversed(a)):
        if 'a' in n:
            return len(a) - i - 1
相关问题