2012-04-21 10 views
0

のためにPythonでリストの項目の値を変更する: ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX']は、私は機能を作成していると機能にこのような文字列のリストを渡していたループ

私は26個の値を持つ変数Xを作成しました。以下の私のコードでは、これらの値を 'card'と呼んでいます( 'for card in X')。

itertoolsとlist comprehensionsを使用して文字列のリストを作成し、Xの各値が新しいリストの 'XX'に置き換えられるようにします。例えば

['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX']は「XX」と呼ばれる(私はTMPと呼ばれる値のリストを作成し、tmp内のアイテムのいずれかの(カードと呼ばれる)「X」の値のリストを代入しています['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value1'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value2'] etc

に拡大します)forループを使用します。

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ループのprint line文が実行されると、私が期待する修正リストが表示されます。 2番目のprint line文が呼び出されると、別のバージョンのmy listが表示されます。私はそれが変更されたforループ内に正しい値を含んでいるように見えるので、tmpを返して使用することはできません。

私は、forループで修正するのが難しいかもしれないと知っています。for line in tmp[:]をループするコードを変更しようとしましたが、それでも問題は解決しませんでした。

コードが印刷さ['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 

印刷ライン文を次のようにそれはあなたが、[ライン、カード]サブリストを変更すると期待している['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'] etc

+1

どう入力スクリプトを与えていますか?あなたはどんな出力を得ていますか?あなたはどんな出力を期待していましたか?あなたはそれをあなたの質問に含めることができますか? –

+0

リストをループしている間は、長さが変わるだけです。いくつかのサンプルデータを追加すると、バグを見つけやすくなります。 –

+0

このコードは、読んだ後、いくつかのランダムな文字列でテストした後、私が期待することをします。私はあなたが何を入れているのか、何を得たいのかを説明しなければならないと思います。 – senderle

答えて

1

を印刷しますtmpリストには同じオブジェクトではなく、それらのコピーがあります。

for line in tmp: 

の場合:変更してみてください

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

そして、あなたが期待通りに動作するかどうかを確認。

編集それはこのように思える

挿入するのではなく、INLISTに追加する、あなたが望むものである:

>>> line = [['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX'], ['value1']] 
>>> line[0].append(line.pop()[0]) 
>>> line 
[['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX', 'value1']] 
>>> 
+0

line in copyのためにtmpの行を置き換えます。deepcopy(tmp)は私の結果を変更しますが、必要な方法では変更しません。あなたは私が実際にはPythonリストのいくつかの側面を理解していないと私に確信しています。私がlist compを介してtmpで作成されている[line、card]リストを変更しているのであれば、なぜtmpにそれらのコピーがないのでしょうか? – somas1

+0

tmpにはサブリストのコピーがありますが、サブリストのコピーはありません。 –

+0

line.pop(1)は何をしたいのですか? popはその項目をリストから削除し、もう一度挿入するのではなく、他の人にそれを割り当てます。それを繰り返すうちにリストを効果的に短くしているので、その結果が異なる結果が表示されます。 –

関連する問題