Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取Python列表中相邻重复元素的索引?_Python_List_Indexing_Repeat - Fatal编程技术网

如何获取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

在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  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]