2012-03-20 7 views
3

これは非常に複雑ですが、ミニリストからアイテムを取り出したときに一度大きなリストをリフレッシュできるようにしたいと思いますより大きなリストの中で。pythonのリスト内のリストからアイテムが削除されたら、リストをリフレッシュするにはどうすればいいですか?

listA = ['1','2','3','4','5','6','6','8','9','5','3','7'] 

私が最初のリストから#3を削除した場合、分割は今#3

del split[0][-1] 
split = [['1','2'],['4','5','6'],['6','8','9'],['5','3','7']] 

なりますスリー

split = [listA[i:(i+3)] for i in range(0, len(listA) - 1, 3)] 

print(split) 

# [['1','2','3'],['4','5','6'],['6','8','9'],['5','3','7']] 

split = [['1','2','3'],['4','5','6'],['6','8','9'],['5','3','7']] 

のリストに分割するには、以下のコードを使用はされています削除された、私はそのように見えるようにリストをリフレッシュできるようにしたいと思います。事前に

split = [['1','2','4'],['5','6','6'],['8','9','5'],['3','7']]

おかげ

+0

だから、毎回それを再計算しませんか? – sll

+0

なぜあなたはそれを必要としているのか少し背景を教えてください。 –

+0

@sll、私はする必要があります。 –

答えて

3

どのようにこのリストが取得されていますが、それを平らにする必要があり、それを再計算しますビッグわからない:リストが変更されたときに、リストやトラックを含むオブジェクトを作成し

>>> listA = ['1','2','3','4','5','6','6','8','9','5','3','7'] 
>>> split = [listA[i:(i+3)] for i in range(0, len(listA) - 1, 3)] 
>>> split 
[['1', '2', '3'], ['4', '5', '6'], ['6', '8', '9'], ['5', '3', '7']] 
>>> del split[0][-1] 
>>> split 
[['1', '2'], ['4', '5', '6'], ['6', '8', '9'], ['5', '3', '7']] 
>>> listA = sum(split, []) # <- flatten split list back to 1 level 
>>> listA 
['1', '2', '4', '5', '6', '6', '8', '9', '5', '3', '7'] 
>>> split = [listA[i:(i+3)] for i in range(0, len(listA) - 1, 3)] 
>>> split 
[['1', '2', '4'], ['5', '6', '6'], ['8', '9', '5'], ['3', '7']] 
2

私はソリティアゲームでデッキのカードの転換のためにこれを必要とします。

あなたは良いキー機能をitertools.groupby()を使用して、あなたのカードを扱うことができます:

def group_key(x, n=3, flag=[0], counter=itertools.count(0)): 
    if next(counter) % n == 0: 
     flag[0] = flag[0]^1 
    return flag[0] 

^bitwise operatorあり、基本的には1およびその逆に0からフラグの値を変更します。フラグ値は何らかのメモをしているのでリストの要素です。

例:

>>> deck = ['1', '2', '3', '4', '5', '6', '6', '8', '9', '5', '3', '7'] 
>>> for k,g in itertools.groupby(deck, key=group_key): 
...  print(list(g)) 
['1', '2', '3'] 
['4', '5', '6'] 
['6', '8', '9'] 
['5', '3', '7'] 

今「9」のは、あなたがカードを使ってきたとしましょうと「8」、あなたの新しいデッキが見えるよう:

>>> deck = ['1', '2', '3', '4', '5', '6', '6', '5', '3', '7'] 
>>> for k,g in itertools.groupby(deck, key=group_key): 
...  print(list(g)) 
['1', '2', '3'] 
['4', '5', '6'] 
['6', '5', '3'] 
['7'] 
+0

これをどのように1つの関数に入れることができますか? –

+0

@CodeBisector:forループを引数として 'deck'を受け取り、' print'の代わりに 'yield list(g)'を受け取り、ジェネレータ(イテレータ)のように使用する関数に入れてください。それ以外の場合は、 'itertools.groupby(deck、key = group_key)]の' 'k、gのlist [g]を返します。選択はあなた次第です。 –

+0

@CodeBisector:あなたのゲームの様子は本当に分かりませんので、私があなたに伝えたいことを見逃すことは自由ですが、このコードを 'deal'メソッドの中に入れたいと思うかもしれません。いくつかの 'デッキ'クラスか何か。 –

2

ちょうどあなたからの単一のリストを作成し直します入れ子にされたリストは、次に再分割されます。

あなたは彼らのようなもので、一つだけレベルの深されていると仮定すると、リストに参加することができます。手の込んだ方法、またはitertoolsまたはいくつかの他のライブラリを使用して、単一のライナーは間違いなくありません

rejoined = [element for sublist in split for element in sublist] 

が、ドンそれを克服してはいけません。数百、数千のアイテムについて話しているだけの場合、このソリューションは十分に良いです。

+0

もっと簡単な方法は 'sum(foo、[])'です。 – FakeRainBrigand

+0

@FakeRainBrigand:あなたが実際に何かを合計していないので、誤解を招くようなコードになると思います。 OTOH、私が示したようなリストの理解は、一見するとぎこちない。おそらく最も明白な方法は 'itertools.chain'を使うことですが、組み込み関数を使って作業を終えることができるときには、1行のコードでモジュール全体を引き出すファンではありません。コメントありがとう。 –

0

を(おそらく書き込みを制御することにより、データを変更するたびにオブジェクトを分割し、オブジェクトのメンバーに分割リストを保存させることができます。

関連する問題