从一个一维列表创建一个包含索引的二维列表

3
我有一个整数列表 x,我想从中创建一个整数的二维列表 y。在这里,y 中每一行 i 都是列表 x 中具有值 i 的元素的索引。

例如,如果:
x = [2, 0, 1, 1, 2, 4],

那么:

y = [[1], [2, 3], [0, 4], [], [5]]

我该如何在Python中完成这个任务?
4个回答

2
这很简单:
y = [[] for _ in xrange(max(x)+1)]
for i, item in enumerate(x):
    y[item].append(i)

我们制作一个正确数量的列表,然后逐个将每个索引添加到相应的子列表中。

2

或者使用列表推导式:

x = [2, 0, 1, 1, 2, 4]
y = [[j for j in range(len(x)) if x[j]==i] for i in range(max(x)+1)]

1
这需要二次时间,并且 range(len(x)) 是外部列表推导的错误范围。 - user2357112
1
我认为你需要使用max(x)+1而不是len(x) - Karnivaurus

1
这是我的快速解决方案。
x = [2, 0, 1, 1, 2, 4]

y = []
for i, k in enumerate(x):
    if len(y) - 1 < k: #if our list isn't long enough for this value
        while (len(y) - 1 != k):
            y.append([]) #make it long enough
    y[k].append(i) #append our current index to this values list

print (y)

1

必要的numpy答案(argwhere的完美应用):

import numpy as np
x = np.array([2, 0, 1, 1, 2, 4])
print [np.argwhere(x == i).flatten().tolist() for i in range(np.max(x)+1)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接