根据索引分开列出

时间:2018-10-25 00:57:45

标签: python python-3.x list

我有2个列表:

data = [0, 1, 2, 3, 7, 8, 9, 10]
indices = [1, 1, 0, 0, 0, 2, 1, 0]

我想将数据附加到二维数组中,并给出对应于二维数组的索引。含义:

new_list = [[]]*len(set(indices))

new_list的结果如下:

new_list = [[2,3,7,10],[0,1,9],[8]]

我正在使用以下代码:

for i in range(len(set(indices)):
    for j in range(len(indices)):
        if indices[j] == i:
            new_list[i].append(data[j])
        else:
            pass

但是,我得到了:

new_list = [[2, 3, 7, 10, 0, 1, 9, 8], [2, 3, 7, 10, 0, 1, 9, 8], [2, 3, 7, 10, 0, 1, 9, 8]]

我不确定自己在犯什么错误,感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您可以使用字典将值映射到它们各自的索引,然后使用range按顺序输出它们,这样这将仅花费 O(n)时间复杂度:

d = {}
for i, n in zip(indices, data):
    d.setdefault(i, []).append(n)
newlist = [d[i] for i in range(len(d))]

newlist变为:

[[2, 3, 7, 10], [0, 1, 9], [8]]

答案 1 :(得分:0)

您正在为每个值完全迭代索引,这很浪费。您还乘以listwhich doesn't do what you expect中的list(它使{{1}中的 same }})。您想将索引和值配对(因此,您要做list而不是list)(这是O(n)的作用,并将您的O(n**2)为空zip个安全(几个独立的list中的list个):

list

答案 2 :(得分:0)

为此,我用索引将数据压缩:

>>>data = [0, 1, 2, 3, 7, 8, 9, 10]
>>>indices = [1, 1, 0, 0, 0, 2, 1, 0]

>>>buff = sorted(list(zip(indices,data)))
>>>print(buff)
[(0, 2), (0, 3), (0, 7), (0, 10), (1, 0), (1, 1), (1, 9), (2, 8)]

然后,我使用一组唯一索引来确定数据是否包含在新列表中。这是通过嵌套列表推导完成的。

>>>new_list = list(list((b[1] for b in buff if b[0]==x)) for x in set(indices))    
>>>print(new_list)
[[2, 3, 7, 10], [0, 1, 9], [8]]

我希望这会有所帮助。