0

関数を作成し、次のような文字列のリストを関数に渡します。 ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX']

26個の値を持つ変数Xを作成しました。以下のコードでは、これらの値を「カード」と呼びます(「Xのカードの場合」)。

itertoolsとリスト内包表記を使用して文字列のリストを作成し、Xの各値が新しいリストの「XX」に置き換えられるようにしています。

例:['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX']に展開します['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value1'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value2'] etc

tmpと呼ばれる値のリストを作成し、forループを使用してtmp内のアイテムの1つ(「XX」と呼ばれる)を「X」値のリスト(カードと呼ばれる)に置き換えています。

 unitoffive = list(itertools.combinations(unit,5))
 newunit = [list(line) for line in unitoffive if 'XX' in line]


 tmp = [[line,card] for line in newunit for card in X]
 for line in tmp:
     line[0][4] = line.pop(line.index(line[1]))
     print line

  for line in tmp:
     print line

私のスクリプトは理解できない動作を示しています。最初のforループのprintlineステートメントを実行すると、期待する変更されたリストが表示されます。2番目のprintlineステートメントが呼び出されると、リストの別の誤ったバージョンが表示されます。tmpは、変更されたforループ内に正しい値しか含まれていないように見えるため、戻って使用することはできません。

Pythonリストをforループで変更するのは難しい場合があることを知っており、ループオーバーするようにコードを変更しようとしましfor line in tmp[:]たが、問題は解決しませんでした。

コードのこのセクションのprintlineステートメントは、['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value1'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value2'] etc期待どおりに出力されます。

for line in tmp:
  line[0][4] = line.pop(line.index(line[1]))
  print line

それに続くprintlineステートメントは['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'] etc

4

1 に答える 1

1

[line、card]サブリストを変更し、tmpリストに同じオブジェクトではなくそれらのコピーが含まれることを期待しています。変更してみてください:

for line in tmp:

にとって:

import copy
for line in copy.deepcopy(tmp):

そして、それが期待どおりに機能するかどうかを確認します。

編集

これはあなたが望むもののようです、挿入する代わりにインリストに追加します:

>>> line = [['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX'], ['value1']]
>>> line[0].append(line.pop()[0])
>>> line
[['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX', 'value1']]
>>> 
于 2012-04-21T21:15:21.483 に答える