2

私は次のことを行う方法を探しています:

  • 私は他のリストで構成されたリストを持っています:TABLE=[table1,table2,table3]
  • このリストを複製したいのですが、次のようにサブリストの名前を変更したいと思います: TABLE_1=[table1_dup=list(table1),table2_dup=list(table2),table3_dup=list(table3)](これは機能しません。目標を説明しようとしているだけです)。 table1、table2、...、および重複を含む TABLE_1。

どうもありがとう!

編集: サブリストの名前は必ずしも同じではありません (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

コメントや編集によって提起されたより一般的な問題については、リストのリストがここでのロジックに適したデータ構造ではないようです。リストは通常​​、テーブルに任意の数の「行」を含めることができる場合に示されます。常に正確に4つあるようです。この場合、タプルの方が優れています。変更されないもののために意図的に設定されていることを除けば、リストのようなものです。そして、さらに良いことに、名前で4つのことに対処したいので、collections.namedtupleこれを簡単にするという標準のPythonクラスがあります。

次のようにTableクラスを定義します。

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

次に、次のように最初のテーブルを作成します。

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

これにより、「アップ」リストをとして取得できます。つまり、コンスタンチtable.upニウスごとにディープコピーを実行すると、これらの名前が無料で付属します。また、リストとまったく同じ方法で繰り返し処理することもできます。table_r

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

ただし、range(len(iterable))通常は反復処理は必要ないことに注意してください。インデックスを使用して2つのテーブルから値を同時に検索しているため、本当に必要なのは組み込み関数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ルックアップ以外には使用しないので、まったく必要ありません。

ただし、これにより、名前付きタプルを使用する際の1つの問題も発生します。気になる可能性があるのは、タプルの作成後にタプルの属性を変更することです。

>>> 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 に答える
1
TABLE_1 = [ table[:] for table in TABLE ]

これは、TABLE のテーブルに不変のみが含まれている場合にのみ、目的に適しています。

于 2012-07-03T13:49:32.593 に答える