如何获取Python列表中相邻重复元素的索引?
在Python列表中只获取相邻重复元素的索引的快速方法是什么如何获取Python列表中相邻重复元素的索引?,python,list,indexing,repeat,Python,List,Indexing,Repeat,在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] 一个集合可以非常方便地避免重复,一旦你有了索引,你就可以将它转换回一个列表并进行排序,因此请尝试以下方法: #拥有 列表1=[2,2,2,3,5,6,6,6] # 0 1 2 5 6
# Have
list1 = [2, 2, 2, 3, 5, 6, 6, 6]
# 0 1 2 5 6 7
# Want
index = [0, 1, 2, 5, 6, 7]
一个集合可以非常方便地避免重复,一旦你有了索引,你就可以将它转换回一个列表并进行排序,因此请尝试以下方法:
#拥有
列表1=[2,2,2,3,5,6,6,6]
# 0 1 2 5 6 7
结果=集合()
对于范围(1,len(列表1))中的i:
如果list1[i-1]==list1[i]:
结果.添加(i-1)
结果.添加(i)
索引=已排序(列表(结果))
您可以使用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]
熊猫很容易
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])
这里有一个O(n)
解决方案。基于@lmiguelvargasf的答案
list1=[2,2,2,3,5,6,6]
# 0 1 2 5 6 7
索引=[]
last=False
对于范围(1,len(列表1))中的i:
如果列表1[i-1]!=清单1[i]:
last=False
最后:
追加索引(一)
last=真
其他:
index.append(i-1)
追加索引(一)
last=真
您的结果将被排序。很确定这是最快的:D。
没有那么短和干净,但肯定很快。经过一段时间的思考,我想出了一种使用numpy的快速方法,而不使用较慢的嵌套for循环: (感谢@lmiguelvargasf下面的回答,改进了解决方案)
您的列表是否保证按升序排序?不是特别排序,而是以重复元素彼此相邻的方式排列第二个元素如何更有效?
not in
操作和in
取O(n)
进行计算!只需查看result
的最后一个元素,看看它是否已经存在exists@MZ问题是,在第一种方法中,我使用的是sorted
,在基本情况下O(n log(n))
O(n^2)
更糟糕。只要看一下result
中的最后一个元素,你就会知道你是否需要添加索引。你建议安装一个库只是为了解决这个问题……我不知道,我想发布一个使用世界上最流行的PKG之一的解决方案可能对一些使用它的人有用,如果你好奇的话,我发布了一个更快的解决方案(O(n)
),但很高兴看到您找到了一个适合您的解决方案!嘿@M Z,谢谢您的评论。您认为last=False
可能不需要,因为i
范围已经解决了这个问题?非常确定您需要它,或者类似的东西,以便管理一些边缘情况。注意:您可以简单地执行index.extend(range(i,i+grp))
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]