嵌套列表中重复列表的索引
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]]
最后,参考上面的代码:
还有一个解决方案:
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())
我正在尝试解决属于我的基因组比对项目一部分的问题。问题如下: 如果给定一个嵌套列表
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]]
最后,参考上面的代码:
还有一个解决方案:
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())