1

リストの重複リストを作成し、重複リストのネストされたリスト内である要素を別の要素に変更しようとしていますが、問題が発生しています。重複リストの作成方法:

order = [['yhjK', 'F'], 'gap', ['bcsA', 'F'], ['bcsB', 'F'], ['bcsZ', 'F'], 'gap', ['yhjK', 'R']]
#order_1 = list(order) #this makes the duplicate list as well
order_1 = []
for x in order:
    order_1.append(x)

要素の変更方法:

for item in order_1:
    for n,i in enumerate(item):
            if i=='R':
                    item[n]='F'
            if i=='F':
                    item[n]='R'

すべての「F」を「R」に、またはその逆に置き換えたい。これはそれを達成しますが、元のリストの「順序」も変更されます。2 番目のリストだけを変更したいのですが、自分のコードの問題がわかりません。

私が得るもの:

order = [['yhjK', 'R'], 'gap', ['bcsA', 'R'], ['bcsB', 'R'], ['bcsZ', 'R'], 'gap', ['yhjK', 'F']]
order_1 = [['yhjK', 'R'], 'gap', ['bcsA', 'R'], ['bcsB', 'R'], ['bcsZ', 'R'], 'gap', ['yhjK', 'F']]

私が欲しいもの:

order = [['yhjK', 'F'], 'gap', ['bcsA', 'F'], ['bcsB', 'F'], ['bcsZ', 'F'], 'gap', ['yhjK', 'R']]
order_1 = [['yhjK', 'R'], 'gap', ['bcsA', 'R'], ['bcsB', 'R'], ['bcsZ', 'R'], 'gap', ['yhjK', 'F']]

みんな、ありがとう!

4

5 に答える 5

4

ここで行っているのはリストの浅いコピーであるため、コピーを変更すると元も変更されます。必要なのはディープコピーです

import copy
order = [['yhjK', 'F'], 'gap', ['bcsA', 'F'], ['bcsB', 'F'], ['bcsZ', 'F'], 
'gap', ['yhjK', 'R']]
order_1 = copy.deepcopy(order)

# Now changing order_1 will not change order
order_1[1] = ['TEST LIST']
print order[1] # Prints 'gap'
print order_1[1] # Prints '['TEST LIST']
于 2012-07-03T16:31:59.947 に答える
3
L = [['F' if x == 'R' else 'R' if x == 'F' else x for x in row] for row in order]
于 2012-07-03T16:40:29.627 に答える
1
import copy
order_1 = copy.deepcopy(order)

デフォルトでは、Python は変更可能な値への参照のみをコピーするため、それらを 1 か所で変更すると、どこでも変更されることになります。ディープ コピーを作成するということは、2 つのインスタンスが完全に独立していることを意味します。

于 2012-07-03T16:32:35.907 に答える
0
order_1 = []
for item in order:
    temp = []
    for i in item:
        if i=="F":
            temp.append("R")
        elif i=="R"
            temp.append("F")
        else:
            temp.append(i)
    order_1.append(temp)
于 2012-07-03T16:33:42.243 に答える
-1

他の多くの言語と同様に、配列は定数にすぎないようです (Python では異なる場合がありますが、実際のポインターでさえありません)。むしろ、配列の最初の要素のアドレスは一定です。これは、配列を直接コピーする場合、最初の要素のアドレスのみをコピーすることを意味します。

あなたの質問から、ディープ コピーが必要であることがわかりました。つまり、ネストされた配列の内容もコピーする必要があります。copy.deepcopy(x)配列のディープコピーを作成するために使用できます。

より詳細な情報については、 copy モジュールを確認してください。

于 2012-07-03T16:47:50.647 に答える