2

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

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

非常感谢!

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

编辑#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,例如,我可以访问。只能上。

4

3 回答 3

8

我认为,该deepcopy功能适合这种场合。

from copy import deepcopy

...
TABLE_1 = deepcopy(TABLE)
于 2012-07-03T13:49:25.400 回答
1
TABLE_1 = [ table[:] for table in TABLE ]

仅当 TABLE 中的表仅包含不可变数据时,这才适合您的目的。

于 2012-07-03T13:49:32.593 回答
1

在评论和您的编辑中提出的更普遍的问题上 - 看起来很像列表列表不是您的逻辑的正确数据结构。当您的表中可以有任意多个“行”时,通常会指示一个列表 - 似乎您总是正好有四个。在这种情况下,元组更好——它有点像一个列表,除了它是为那些不会改变的东西而更刻意地设置的。而且,更好的是,由于您想通过名称来处理您的四件事,因此有一个名为的标准 Python 类collections.namedtuple可以让这变得简单。

您将像这样定义一个 Table 类:

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

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

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

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

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)))

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

但这也带来了使用 namedtuple 的一个问题——它不能做的你可能关心的一件事是在创建元组后更改它的属性:

>>> 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在任何时候重新分配给新列表(您仍然可以通过其变异方法和切片分配来更改列表本身) - 如果您需要,您最好编写您的为此自己上课。

于 2012-07-03T14:39:46.203 回答