我想迭代列表末尾的元素,以找到包含'}'的元素最后一次出现的索引。
理想情况下,我希望使用迭代器来保持效率,而不是实际反转整个列表或搜索符合此条件的所有匹配项。
如果我找到第一次出现,我会使用:
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。
提前致谢。
答案 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