如果我输入了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]]
我该如何编码?有内置的功能可以做到这一点吗?如果没有,有什么暗示或建议吗?谢谢。
答案 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)