関数を作成し、次のような文字列のリストを関数に渡します。
['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