创建和使用列表列表:在Python中

时间:2014-12-14 23:55:46

标签: python list containers

我是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 ]

我做错了什么?

2 个答案:

答案 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应该在性能方面至少与理解一样好。