如何使用For循环或Vectorization在Python中定义大型列表数组?

时间:2017-07-12 14:41:16

标签: python arrays

我有一个416行的2D列表,每行有4列。第1-4行包含它们的行号4次(即[...[1,1,1,1],[2,2,2,2]...]。第330行包含[41,22,13,13]。其他所有内容都是[0,0,0,0]。目前我正在使用带有许多显式if语句的for循环。

myList = [[0,0,0,0]]
for i in range(1, 416):
    if i == 1 or i == 2 or i == 3 or i == 4:
        myList.append([i,i,i,i])
    elif i == 330:
        myList.append([41,22,13,13])
    else:
        myList.append([0,0,0,0])

对我来说定义这个数组有什么更有效的方法?

我在SO上看到的其他问题似乎没有明确地解决这个问题,但如果有人发现一个可以被认为是重复的问题,请标记这个问题,我会接受它。

2 个答案:

答案 0 :(得分:7)

由于列表的大部分是零的子列表(在数组术语中,稀疏),我只是预先分配然后使用切片赋值/索引进行更新:

my_list = [[0, 0, 0, 0] for _ in range(416)]
my_list[330] = [41,22,13,13]
my_list[1:5] = [[i]*4 for i in range(1, 5)]

这避免了对大量错误案例和重复附加的重复分支评估。

如果您实际上将数据结构保持为稀疏矩阵,则可以避免在您的记忆中存在零的OTOH。您可以查看SciPy 2-D sparse matrix package

答案 1 :(得分:1)

脱离我的头脑,这是一种非常简单快捷的方法:

import itertools

answer = list(itertools.chain([[i,i,i,i] for i in range(1,5)], [[0,0,0,0] for _ in range(330-6)], [[41,22,13,13]], [[0,0,0,0] for _ in range(416-330)]))