Как получить индекс соседних повторяющихся элементов в списке Python? - PullRequest
2 голосов
/ 11 июля 2020

Каков быстрый способ получить индекс только соседних повторяющихся элементов в списке Python?

# Have 
list1 = [2, 2, 2, 3, 5, 6, 6, 6]
#        0  1  2        5  6  7

# Want
index = [0, 1, 2, 5, 6, 7]

Ответы [ 5 ]

4 голосов
/ 11 июля 2020

Набор будет очень удобен, чтобы избежать дублирования, и когда у вас есть индексы, вы можете скрыть его обратно в список и отсортировать его, поэтому попробуйте следующее:

# Have 
list1 = [2, 2, 2, 3, 5, 6, 6, 6]
#        0  1  2        5  6  7

result = set()
for i in range(1, len(list1)):
    if list1[i - 1] == list1[i]:
        result.add(i - 1)
        result.add(i)
index = sorted(list(result))
1 голос
/ 11 июля 2020

Вот решение O(n). На основе ответа @lmiguelvargasf.

list1 = [2, 2, 2, 3, 5, 6, 6, 6]
#        0  1  2        5  6  7

index = []

last = False
for i in range(1, len(list1)):
    if list1[i - 1] != list1[i]:
        last = False
    elif last:
        index.append(i)
        last = True
    else:
        index.append(i - 1)
        index.append(i)
        
        last = True

Ваш результат будет отсортирован. Уверен, что это так быстро, как только возможно: D. Не такой короткий и чистый, но определенно быстрый.

1 голос
/ 11 июля 2020

легко в pandas

import pandas as pd
df = pd.DataFrame(list1)
ids = df.index[(df[0].diff() == 0) | (df[0].diff(-1) == 0)].values

вывод:

array([0, 1, 2, 5, 6, 7])
1 голос
/ 11 июля 2020

Вы можете использовать itertools.groupby для обработки группировки соседних повторяющихся элементов:

from itertools import groupby

list1 = [2, 2, 2, 3, 5, 6, 6, 6]

index, i = [], 0
for k, g in groupby(list1):
    grp = len(list(g))
    if grp > 1:
        index.extend(range(i, i+grp))
        i += grp
    else:
        i += 1
    
print(index)
# [0, 1, 2, 5, 6, 7]
0 голосов
/ 11 июля 2020

Некоторое время разобравшись, я пришел к быстрому способу, используя numpy без использования более медленных вложенных циклов for:

(Улучшение решения благодаря ответу ниже от @lmiguelvargasf )

dup_ix = [(i, i-1) for i in range(1, len(list1)) if list1[i] == list1[i-1]]
    
dup_ix = np.array(dup_ix).flatten() 
dup_ix = list(set(dup_ix))
    
print(dup_ix)
[0, 1, 2, 5, 6, 7]
...