python最后怎么呈现_如何在Python列表中查找项目的最后一次出现

如何在Python列表中查找项目的最后一次出现

说我有这个清单:

li = ["a", "b", "a", "c", "x", "d", "a", "6"]

据帮助显示,没有一个内置函数返回字符串的最后一次出现(如index的反向操作)。 因此,基本上,如何在给定列表中找到"a"的最后一次出现?

13个解决方案

69 votes

如果您实际上只使用示例中显示的单个字母,则li会很方便地工作。 如果不存在这样的项目,则会引发li,与list.index会引发相同的错误类别。 演示:

>>> li = ["a", "b", "a", "c", "x", "d", "a", "6"]

>>> ''.join(li).rindex('a')

6

对于更一般的情况,您可以在反向列表上使用li:

>>> len(li) - 1 - li[::-1].index('a')

6

这里的切片将创建整个列表的副本。 短列表很好,但是对于li非常大的情况,使用惰性方法可以提高效率:

def list_rindex(li, x):

for i in reversed(range(len(li))):

if li[i] == x:

return x

raise ValueError("{} is not in list".format(x))

一线版:

next(i for i in reversed(range(len(li))) if li[i] == 'a')

wim answered 2019-10-09T05:40:49Z

27 votes

像伊格纳西奥(Ignacio)一样的单线飞机会更简单/更清晰

max(loc for loc, val in enumerate(li) if val == 'a')

在我看来,这似乎很清楚且具有Python风格:您正在寻找包含匹配值的最高索引。 不需要下一步,lambda,reverses或itertools。

alcalde answered 2019-10-09T05:41:21Z

15 votes

许多其他解决方案都需要遍历整个列表。 这不是。

def find_last(lst, elm):

gen = (len(lst) - 1 - i for i, v in enumerate(reversed(lst)) if v == elm)

return next(gen, None)

编辑:事后看来,这似乎是不必要的巫术。 我会做这样的事情:

def find_last(lst, sought_elt):

for r_idx, elt in enumerate(reversed(lst)):

if elt == sought_elt:

return len(lst) - 1 - r_idx

Isaac answered 2019-10-09T05:41:54Z

7 votes

我既喜欢wim的回答,也喜欢Ignacio的回答。 但是,尽管lambda,我认为lambda提供了一种更具可读性的替代方法。 (对于Python 3;对于Python 2,请使用ValueError代替range)。

>>> from itertools import dropwhile

>>> l = list('apples')

>>> l.index('p')

1

>>> next(dropwhile(lambda x: l[x] != 'p', reversed(range(len(l)))))

2

如果找不到该项目,则会引发lambda例外; 您可以抓住它并举一个ValueError,以使其表现得像lambda。

定义为函数,避免了lambda快捷方式:

def rindex(lst, item):

def index_ne(x):

return lst[x] != item

try:

return next(dropwhile(index_ne, reversed(range(len(lst)))))

except StopIteration:

raise ValueError("rindex(lst, item): item not in list")

它也适用于非字符。 经过测试:

>>> rindex(['apples', 'oranges', 'bananas', 'apples'], 'apples')

3

senderle answered 2019-10-09T05:42:43Z

6 votes

>>> (x for x in reversed([y for y in enumerate(li)]) if x[1] == 'a').next()[0]

6

>>> len(li) - (x for x in (y for y in enumerate(li[::-1])) if x[1] == 'a').next()[0] - 1

6

Ignacio Vazquez-Abrams answered 2019-10-09T05:43:03Z

3 votes

您可以使用以下事实:字典键是唯一的,当使用元组构建字典键时,将仅使用特定键的值的最后分配。 如其他答案中所述,这对于小型列表很好,但是它为所有唯一值创建了字典,对于大型列表可能不是有效的。

dict(map(reversed, enumerate(li)))["a"]

6

piRSquared answered 2019-10-09T05:43:31Z

2 votes

我来到这里是希望发现有人已经完成了编写最高效的len(seq) - 1 - next(i for i,v in enumerate(reversed(seq)) if v == value)版本的工作,该版本提供了list.index的完整接口(包括可选的start和stop)。 在这个问题的答案中,在这里,在这里或这里,我都没有发现。 因此,我自己整理了这些信息...利用了有关此问题的其他答案以及其他问题的建议。

def rindex(seq, value, start=None, stop=None):

"""L.rindex(value, [start, [stop]]) -> integer -- return last index of value.

Raises ValueError if the value is not present."""

start, stop, _ = slice(start, stop).indices(len(seq))

if stop == 0:

# start = 0

raise ValueError('{!r} is not in list'.format(value))

else:

stop -= 1

start = None if start == 0 else start - 1

return stop - seq[stop:start:-1].index(value)

在其他几个答案中提出的使用len(seq) - 1 - next(i for i,v in enumerate(reversed(seq)) if v == value)的技术可以节省更多空间:无需创建完整列表的反向副本。 但是在我的(临时的,临时的)测试中,它慢了约50%。

dubiousjim answered 2019-10-09T05:44:13Z

1 votes

使用一个简单的循环:

def reversed_index(items, value):

for pos, curr in enumerate(reversed(items)):

if curr == value:

return len(items) - pos - 1

raise ValueError("{0!r} is not in list".format(value))

Laurent LAPORTE answered 2019-10-09T05:44:40Z

1 votes

last_occurence=len(yourlist)-yourlist[::-1].index(element)-1

就这么简单。无需导入或创建函数。

Prabu M answered 2019-10-09T05:45:09Z

0 votes

def rindex(lst, val):

try:

return next(len(lst)-i for i, e in enumerate(reversed(lst), start=1) if e == val)

except StopIteration:

raise ValueError('{} is not in list'.format(val))

user2426679 answered 2019-10-09T05:45:30Z

0 votes

val = [1,2,2,2,2,2,4,5]。

如果您需要找到2的最后一次出现

last_occurence = (len(val) -1) - list(reversed(val)).index(2)

user2782561 answered 2019-10-09T05:46:11Z

0 votes

这是使用enumerate和列表理解来获取最后一个索引的一些方法:

li = ["a", "b", "a", "c", "x", "d", "a", "6"]

[l[0] for l in enumerate(li) if l[1] == "a"][-1]

quazgar answered 2019-10-09T05:46:39Z

0 votes

from array import array

fooa = array('i', [1,2,3])

fooa.reverse() # [3,2,1]

fooa.index(1)

>>> 2

cop4587 answered 2019-10-09T05:47:00Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值