繁体   English   中英

对列表中相同元素的索引进行分组的有效方法

[英]Efficient way to group indices of the same elements in a list

假设我有一个如下所示的列表:

[1, 2, 2, 5, 8, 3, 3, 9, 0, 1]

现在我想对相同元素的索引进行分组,所以结果应该如下所示:

[[0, 9], [1, 2], [3], [4], [5, 6], [7], [8]]

我如何以有效的方式做到这一点? 我尽量避免使用循环,因此任何使用 numpy/pandas 函数的实现都很棒。

使用 pandas GroupBy.apply ,这非常简单——使用您的数据对一系列索引进行分组。 一个不错的好处是您可以保持索引的顺序。

data = [1, 2, 2, 5, 8, 3, 3, 9, 0, 1]
pd.Series(range(len(data))).groupby(data, sort=False).apply(list).tolist()
# [[0, 9], [1, 2], [3], [4], [5, 6], [7], [8]]

您可以使用collections.defaultdict对索引进行分组:

from collections import defaultdict

lst = [1, 2, 2, 5, 8, 3, 3, 9, 0, 1]

d = defaultdict(list)
for i, x in enumerate(lst):
    d[x].append(i)

print(list(d.values()))
# [[0, 9], [1, 2], [3], [4], [5, 6], [7], [8]]

它还保持添加索引的顺序而不进行排序。

这个解决方案是对哈希计数的修改,但不是计数,而是存储找到的值的索引。

arr = [1,2,2,5,8,3,3,9,0,1]
d = dict()  
for i,v in enumerate(arr):  
    d[v] = d.get(v,[]) #use an if-statement to avoid doing this too often
    d[v].append(i) 
print(d.values()) 

不确定为什么要“避免循环”,因为无法知道您调用的函数无论如何都没有使用循环,从而增加了函数调用的开销。

此外,分组后,您会丢失有关分组内容的信息 - 因此将输出放入dict似乎更有意义。

这是这样做的:

from itertools import groupby

l = [1, 2, 2, 5, 8, 3, 3, 9, 0, 1]
result = {
    key: [item[0] for item in group]
    for key, group in groupby(sorted(enumerate(l), key=lambda x: x[1]), lambda x: x[1])
}

print(result)

输出:

{0: [8], 1: [0, 9], 2: [1, 2], 3: [5, 6], 5: [3], 8: [4], 9: [7]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM