我有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]]
我不确定自己在犯什么错误,感谢您的帮助!
答案 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)
您正在为每个值完全迭代索引,这很浪费。您还乘以list
个which 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]]
我希望这会有所帮助。