嵌套列表中重复列表的索引

Indices of duplicate lists in a nested list

我正在尝试解决属于我的基因组比对项目一部分的问题。问题如下: 如果给定一个嵌套列表

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 中实现此目的的最佳方法是什么?

您可以创建一个字典(如果在较旧的 python 上,则可以创建 OrderedDict)。 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]]

您可以使用列表理解和范围来检查重复索引并将它们附加到 result

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]

如果我们查看我们的变量 - inverse,我们可以看到我们确实得到了 [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]]

最后,参考上面的代码:

Numpy - unique, where, argsort

还有一个解决方案:

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())