在python中复制列表

时间:2012-07-03 13:47:16

标签: python list copy

我正在寻找一种方法来执行以下操作:

  • 我有一个由其他列表组成的列表:TABLE=[table1,table2,table3]
  • 我想复制此列表,但重命名子列表,例如:TABLE_1=[table1_dup=list(table1),table2_dup=list(table2),table3_dup=list(table3)](这不起作用;我只是想解释我的目标),以便我可以在以后独立访问tablex和tablex_dup在整个TABLE和TABLE_1上执行批处理操作,包括table1,table2,...和重复项。

非常感谢!

编辑:子列表不一定命名相同(table1,table2,table3)。实际上,他们的名字完全不同(例如上,下,左,右)

编辑#2:编辑#2: 我对此有点新意。基本上,这是我的代码:

up=["img1.png","img2.png"]

向下,向左和向右类似的东西。

table=[up,down,left,right]

现在使用pygame:

for j in range(len(table)):
        for i in range(len(table[j])):
            table[j][i] = pygame.image.load(os.path.join(str(table[j][i])))
            table_r[j][i] = pygame.image.load(os.path.join(str(table_r[j][i])))
            table_r[j][i] = pygame.transform.flip(table_r[j][i],1,0)

这不起作用,因为没有up_r,例如,我可以访问。只有。

3 个答案:

答案 0 :(得分:8)

我认为,deepcopy功能适合这种情况。

from copy import deepcopy

...
TABLE_1 = deepcopy(TABLE)

答案 1 :(得分:1)

TABLE_1 = [ table[:] for table in TABLE ]

如果TABLE中的表只包含不可变项,那么这只适合您的目的。

答案 2 :(得分:1)

关于评论和编辑中提出的更一般性问题 - 看起来非常像列表列表不是您逻辑的正确数据结构。当您在表格中有任意多个“行”时,通常会显示一个列表 - 似乎您总是只有四个。在这种情况下,元组更好 - 它有点像一个列表,除了它是为了不改变的事情而更专心地设置。而且,更好的是,因为你想通过名字解决你的四件事,所以有一个名为collections.namedtuple的标准Python类,这使得这很容易。

您可以像这样定义一个Table类:

Table = namedtuple('Table', ['up', 'down', 'left', 'right'])

然后你就像这样创建你的第一个表:

table = Table(up=["img1.png","img2.png"], down=..., left=..., right=...)

这样,您就可以将“向上”列表设为table.up,这意味着当您对每个Constantinius的答案进行table_r深度复制时,这些名称随附免费。它还允许您以与列表完全相同的方式迭代它:

for i in range(len(table)):
    for j in range(len(table[i])):
       ...

但是,请注意,通常不需要迭代range(len(iterable)) - 因为您使用索引同时查找两个表中的值,您真正想要的是一个组合内置函数enumeratezip

for row, row_r in zip(table, table_r):
    for i, (val, val_r) in enumerate(zip(row, row_r)):
       row[i] = pygame.image.load(os.path.join(str(val)))
       row_r[i] = pygame.image.load(os.path.join(str(val_r)))

您只需要将索引分配到列表中,因为内部循环内的重新绑定valval_r将不起作用。由于您不将j用作查找以外的任何内容,因此根本不需要它。

但是这也带来了一个使用了一个命名元组的空洞 - 你可能不关心的一件事就是在创建元组后更改元组的属性:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x = 2
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    p.x = 2
AttributeError: can't set attribute

在您的情况下,这意味着您无法在任何时候将table.up重新分配给新列表(您仍然可以通过其变异方法和切片分配来更改列表本身) - 如果您需要,你最好为此编写自己的课程。