如何从列表中提取相等元素的索引?

时间:2019-10-11 05:39:40

标签: python python-3.x list numpy numpy-ndarray

如果我输入了a = [3.0, 4.0, 2.5, 2.5, 3.0], 有两个3.0,一个4.0和两个2.5

如您所见,a[0] = a[4]a[1]本身就是a[2] = a[3]

我希望输出为[[0,4], [1], [2,3]]

我该如何编码?有内置的功能可以做到这一点吗?如果没有,有什么暗示或建议吗?谢谢。

3 个答案:

答案 0 :(得分:3)

首先,利用collections.defaultdict的简单解决方案。请注意,这仅适用于平面(一维)列表!

from collections import defaultdict 

def group_by_value(lst_in):
    res_dict = defaultdict(list)
    for idx, item in enumerate(lst_in):
        res_dict[item].append(idx)
    return res_dict

defaultdict就像dict一样,不同的是,当您像d = defaultdict(list)一样初始化它时,d[x]将解析为空列表[],如果{{1 }}不在x中定义的键中。


这里是使用numpy的解决方案,无论尺寸大小如何,该解决方案都可以使用。这个想法值得赞扬,@meTchaikovsky

d

感谢@AlexanderCécile重构了此答案;)

答案 1 :(得分:2)

sol = {}        
for i, j in enumerate(a):
    if j in sol:
        sol[j].append(i)
    else:
        sol[j] = [i]
[sol[i] for i in sol]
[[0, 4], [1], [2, 3]]

答案 2 :(得分:0)

您可以在numpy的帮助下完成

import numpy as np

a = np.array(a)
result = [np.arange(len(a))[a == item].tolist() for item in np.unique(a)]

其中result是您想要的列表。

不使用numpy

result = []
unique_vals = set(a)

for val in unique_vals:
    tmp = []
    for ind, item in enumerate(a):
        if item == val:
            tmp.append(ind)
    result.append(tmp)