python列表中重复项的最后索引

时间:2018-12-10 22:30:01

标签: python list

有人知道我如何在包含重复项和非重复项的python列表中获取重复项的最后索引位置吗? 我有一个列表,以[1, 1, 1, 2, 2, 3, 3, 4, 5]升序排列 我希望它打印重复项的最后一个索引,并在非重复项上打印这样的索引

2
4
6
7
8

我尝试过这种方式,但是只能打印重复元素的起始索引和错过的非重复项。

id_list = [1, 1, 1, 2, 2, 3, 3, 4, 5]
for i in range(len(id_list)):
    for j in range(i+1,len(id_list)):
        if id_list[i]==id_list[j]:
            print(i)

3 个答案:

答案 0 :(得分:3)

使用enumerate在列表上循环以获取索引和值,并使用字典并保留最后一个索引(如果有重复,则最后一个索引“获胜”)。最后,对索引进行排序(因为字典没有顺序,但是您可以使用OrderedDict):

import collections

lst = [1, 1, 1, 2, 2, 3, 3, 4, 5]
d = collections.OrderedDict()

for i,v in enumerate(lst):
    d[v] = i

print(list(d.values()))

打印:

[2, 4, 6, 7, 8]

此解决方案的优点在于,即使重复项不是连续的,它也可以工作。

Python 3.7保证了基本字典的顺序,因此简单的dict理解就可以解决它:

{v:i for i,v in enumerate(lst)}.values()

答案 1 :(得分:3)

您可以使用enumerate并检查列表中的下一个索引。如果一个元素不等于下一个索引中的元素,则它是最后一个重复项:

lst = [1, 1, 1, 2, 2, 3, 3, 4, 5]
result = [i for i, x in enumerate(lst) if i == len(lst) - 1 or x != lst[i + 1]]

print(result)
# [2, 4, 6, 7, 8]

答案 2 :(得分:0)

您可以对enumeratezip使用列表推导。最后一个值总是在范围内,因此我们可以在末尾显式包括它。

L = [1, 1, 1, 2, 2, 3, 3, 4, 5]

res = [idx for idx, (i, j) in enumerate(zip(L, L[1:])) if i != j] + [len(L) - 1]

print(res)

# [2, 4, 6, 7, 8]