2012-03-19 12 views
1

複数の項目を1つのリストから別のリストに移動したいと思います。 ' '上記のコードで複数の項目を1つのリストから別のリストに移動するには

list1 = ['2D',' ',' ',' ',' ',' ',' ',' ',' '] 
list2 = ['XX','XX','5D','4S','3D',' ',' ',' ',' '] 
list3 = ['XX','XX','XX','8C','7H','6C',' ',' ',' '] 

Iはlist3'8C','7H','6C'list2から'5D','4S','3D'を移動できるようにしたいダブルスペース

あります。

私は以下のコードを試しましたが、動作しません。

list1 = ['2D',' ',' ',' ',' ',' ',' ',' ',' '] 
list2 = ['XX','XX','5D','4S','3D',' ',' ',' ',' '] 
list3 = ['XX','XX','XX','8C','7H','6C',' ',' ',' '] 


items_to_be_moved = list2[list2.index('XX')+2 : list2.index(' ')] 

list3[list3.index(' ')] = items_to_be_moved 
del list2[list2.index('XX')+2 : list2.index(' ')] 

print('list2',list2) 
print('list3',list3) 

と、これは

list2 ['XX', 'XX', ' ', ' ', ' ', ' '] 
list3 ['XX', 'XX', 'XX', '8C', '7H', '6C', ['5D', '4S', '3D'], ' ', ' '] 

を返します。しかし、私はlist2.index('XX')+2を使用したくない、私は' 'の最初のインデックスを与えるだけでlist2.index(' ')よう'XX'の最後のインデックスを与えるコードを使用したいと思います。

また、移動したアイテムを別のリスト内の別のリストに入れることをお勧めしません。たとえば、 :代わりに

"list3 ['XX', 'XX', 'XX', '8C', '7H', '6C','5D', '4S', '3D', ' ', ' ']" 

が返されるべきリスト

"list3 ['XX', 'XX', 'XX', '8C', '7H', '6C', ['5D', '4S', '3D'], ' ', ' ']" 

を返します。

答えて

6

とをループしてみます。

list1 = ['2D',' ',' ',' ',' ',' ',' ',' ',' '] 
list2 = ['XX','XX','5D','4S','3D',' ',' ',' ',' '] 
list3 = ['XX','XX','XX','8C','7H','6C',' ',' ',' '] 

list3[3:6] = list2[2:5] 

print list3 
# ['XX', 'XX', 'XX', '5D', '4S', '3D', ' ', ' ', ' '] 

あなたが最後の連続した'XX'後から開始したい場合は、使用することができます。

from itertools import takewhile 
i = sum(1 for _ in takewhile(lambda elem: elem == 'XX', list3)) 

list3[i:i+3] = list2[i-1:i+2] 

を最後のインデックスを見つけること。第二のトピックで

+0

これは関数で使用されるため、私はインデックスを使用したいと思います。 –

+0

これは最後の 'xx'インデックスを動的に見つけることに関する質問者の質問を解決しません – alonisser

+0

@CodeBisectorインデックスを見つける方法を追加しました。 – agf

0

は正しい項目、使用スライスの割り当てを交換するに

for item in items_to_be_moved: 
    # Add items one at a time 
0

は、リストの最後のoccuranceを見つけるための機能がないと思うが、あなたはどちらかのインプレースループ

pos = 0 
while 1: 
    try: 
     pos = list3.index('XX',pos+1) 
    except ValueError: 
     break 
if pos == 0 and list3[0] != 'XX': 
    #Do something to pos if there was no XX in list... 

またはリストを反転を行う行うことができますindex-thingそれを逆戻りして位置を再計算する。

list3.reverse() 
pos = list3.index('XX') 
list3.reverse() 
pos = len(list3) - pos - 1 
1

まず、ここではfind the last indexです。ただし、最後のコピーのインデックス番号がXXの場合は、リストにたとえば['XX', '1D', 'XX', '4S']と表示されているので、真ん中に有効なアイテムがあるとしたらどうなりますか?とにかく

、あなたは別のリストから移動するスパンを持っていたら、あなたが挿入を行うと、削除するスライス演算子を使用するだけです:

>>> list2[2:5] 
['5D', '4S', '3D'] 
>>> list3[6:6] = list2[2:5] 
>>> list3 
['XX', 'XX', 'XX', '8C', '7H', '6C', '5D', '4S', '3D', ' ', ' ', ' '] 

あなたがから削除するdelを使用することができますLIST2、またはあなただけのスライスに割り当てることができます。

必要とする前に「xx」にはすべて、別の方法がある常にあるだけでなく場合
>>> list2[2:5] = [] 
>>> list2 
['XX', 'XX', ' ', ' ', ' ', ' '] 
+0

リストのサイズを変更したり、値を移動したりする必要がないため、古い値をスライスに代入するのは高速です。あなたの方法では、そのポイントの後のすべての値をリストの2回移動させます。最後の索引を見つけるリンクされた方法では、リストのコピーを作成し、リスト全体を反復する必要がありますが、これは不要です。 – agf

+0

新しい(出力)リストを上書きしないでもっと大きくしたいと思ったようです。彼のサンプル入力 'list3'には10個の項目があり、サンプル出力には11があり、これは純粋な挿入または純粋な上書きのいずれとも一致しないため、少し混乱します。 (私は、step-by-negative-oneスライスメソッドがPythonの中に特別なものではないことに驚いています。 '' itertools''は一般的に非常に速いので、連続したXX項目を取得する明白な方法です) – torek

+0

ガー、私は戻って入力、出力、問題を再読しました。 「上書きする」と言ってください。 – torek

2

「list.countを使用して((@turekによって提案された1の横) 'xx') 'とスライス:

list[count-1:count+2] 

あなたは@内-C

0

によって提案されたようにも、私はおそらく端からスライスするための負のインデックスを忘れてはいけない繰り返すだろう挿入を行うために、スライス演算子を使用することができます。

i2_begin = -list2[::-1].index('XX') 
i2_end = list2.index(' ') 
i3 = list3.index(' ') 

list3[i3:i3] = list2[i2_begin:i2_end] 
del list2[i2_begin:i2_end] 
+0

これはまさに私が欲しかったものです。本当にありがとう。 –

関連する問題