Последний индекс повторяющихся элементов в списке Python - PullRequest
0 голосов
/ 11 декабря 2018

Кто-нибудь знает, как я могу получить последнюю позицию индекса дубликатов в списке 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 голосов
/ 11 декабря 2018

Цикл по списку с использованием 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 гарантирует порядок базовых словарей, так что простое толкование разборов решает его:

{v:i for i,v in enumerate(lst)}.values()
0 голосов
/ 11 декабря 2018

Вы можете использовать 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]
0 голосов
/ 11 декабря 2018

Вы можете использовать понимание списка с enumerate и zip.Последнее значение будет всегда в области видимости, поэтому мы можем явно включить его в конец.

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...