performance - python - 在嵌套列表中,重复列表的索引

我试图解决一个问题,这是基因组比对项目的一部分,问题如下:如果给定一个嵌套列表

y = [[1,2,3],[1,2,3],[3,4,5],[6,5,4],[4,2,5],[4,2,5],[1,2,8],[1,2,3]]

将唯一列表的索引再次提取到嵌套列表中。

例如,上面的嵌套列表的输出应该是

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

这是因为列表[1,2,3]出现在0,1,7th索引位置,[3,4,5]在第二个索引位置等等。

因为我要处理大型列表,在python中,最理想的方法是什么?

时间: 原作者:

你可以创建一个字典,dict的键是子列表的元组,值是一个索引数组,循环后,字典值将保存你的答案:


from collections import OrderedDict



y = [[1,2,3],[1,2,3],[3,4,5],[6,5,4],[4,2,5],[4,2,5],[1,2,8],[1,2,3]]



lookup = OrderedDict()


for idx,l in enumerate(y):


 lookup.setdefault(tuple(l), []).append(idx)



list(lookup.values())


# [[0, 1, 7], [2], [3], [4, 5], [6]]



原作者:

可以使用列表推导和range检查重复的索引并将它附加结果。


result = []


for num in range(len(y)):


 occurances = [i for i, x in enumerate(y) if x == y[num]]


 if occurances not in result: result.append(occurances)



result


#[[0, 1, 7], [2], [3], [4, 5], [6]]



原作者:

考虑numpy来解决这个问题:


import numpy as np



y = [


 [1, 2, 3],


 [1, 2, 3],


 [3, 4, 5],


 [6, 5, 4],


 [4, 2, 5],


 [4, 2, 5],


 [1, 2, 8],


 [1, 2, 3]


]



# Returns unique values of array, indices of that


# array, and the indices that would rebuild the original array


unique, indices, inverse = np.unique(y, axis=0, return_index=True, return_inverse=True)



下面是每个变量的打印输出:


unique = [


[1 2 3]


[1 2 8]


[3 4 5]


[4 2 5]


[6 5 4]]



indices = [0 6 2 4 3]



inverse = [0 0 2 4 3 3 1 0]



如果我们看看逆变量,可以看到我们确实得到了[0.1.7]作为第一个唯一元素[1 ,2 ,3]的索引位置,我们现在需要做的就是对它们进行适当的分组。


new_list = []


for i in np.argsort(indices):


 new_list.append(np.where(inverse == i)[0].tolist()) 



输出:


new_list = [[0, 1, 7], [2], [3], [4, 5], [6]]



原作者:

另一个解决方案:


y = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [6, 5, 4], [4, 2, 5], [4, 2, 5], [1, 2, 8], [1, 2, 3]]



occurrences = {}



for i, v in enumerate(y):


 v = tuple(v)


 if v not in occurrences:


 occurrences.update({v: []})


 occurrences[v].append(i)



print(occurrences.values())



原作者:
...