【问题标题】:Creating and working with list of lists of lists: in Python [duplicate]创建和使用列表列表:在 Python [重复]
【发布时间】:2014-12-14 23:55:45
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 不需要追加,list[0][0] = 1 应该可以工作
  • @chris 但我也需要 list[0][0] 成为一个列表

标签: python list containers


【解决方案1】:

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 个不同的(但都是空的)列表,或者,更 Python 的,[list() for _ in range(4)] 或只是 [[] for _ in range(4)]

【讨论】:

  • 我想我明白了。有什么解决办法吗?
  • 那么,有没有办法调用构造函数4次?
  • 有几种方法 - 请参阅我的编辑或下面的其他答案。
【解决方案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 头来说,列表推导更可取。列表组合应该在性能方面至少与理解一样好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多