我是Python的新手,为了满足某些需求,我想弄清楚如何处理列表列表。
这就是我在做什么:
segment_coef = [[list()]*4]*17
print segment_coef
segment_coef[0][0].append(1)
segment_coef[1][0].append(2)
segment_coef[2][0].append(3)
print segment_coef
首先print
我有:
[ [ [],[],[],[] ] , ... 14 more time ... , [ [],[],[],[] ] ]
在这三个append
命令之后,我想要像:
[ [ [1],[],[],[] ] , [ [2],[],[],[] ], [ [3],[],[],[] ] ]
但我有:
[ [ [1,2,3],[1,2,3],[1,2,3],[1,2,3] ] , [ [1,2,3],[1,2,3],[1,2,3],[1,2,3] ], ... up to the end ]
我做错了什么?
答案 0 :(得分:4)
Python使用相同的列表4次,然后它使用相同的4个列表列表17次!
这里的问题是python列表都是可变的,并且您多次使用(引用)相同的列表。因此,当您修改列表时,对该列表的所有引用都会显示差异。
取决于您获取数据的方式/位置,取决于解决问题的最佳方法,但有类似的内容:
lols = []
for i in range(17):
lols.append([1,2,3,4])
# lols is not a list of 17 lists, each list contains the same data but they are different lists
lols[0][0] = 99
# Now only the first element from the first list is updated.
要明确的是,问题来自于执行[list() * 4]
,它会列出列表(使用list
),然后重复4次。如果您执行了[list(), list()m list(), list()]
,那么您将获得4个不同的(但都是空的)列表,或者更为热情,[list() for _ in range(4)]
或仅[[] for _ in range(4)]
答案 1 :(得分:2)
有几种方法可以创建17个列表,每个列表包含4个子列表
最短的将是
[[list() for i in range(4)] for j in range(17)]
如果你这样做,你的追加将按你希望的那样工作
如果您熟悉没有列表推导的C或Java等语言,这种方式可能会让您更熟悉:
l = []
for j in range (17):
k = []
for i in range (4):
k.append(list())
l.append (k)
这也是可以接受的,但是对于许多python头来说,列表理解是更可取的。列表comp应该在性能方面至少与理解一样好。