我正在寻找一种方法来执行以下操作:
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,例如,我可以访问。只有。
答案 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))
- 因为您使用索引同时查找两个表中的值,您真正想要的是一个组合内置函数enumerate
和zip
:
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)))
您只需要将索引分配到列表中,因为内部循环内的重新绑定val
和val_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
重新分配给新列表(您仍然可以通过其变异方法和切片分配来更改列表本身) - 如果您需要,你最好为此编写自己的课程。