我有一个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上看到的其他问题似乎没有明确地解决这个问题,但如果有人发现一个可以被认为是重复的问题,请标记这个问题,我会接受它。
答案 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)]))