1

Pythonを使用しているのですが、元の要素のリストから特定の長さのリストの組み合わせを作成するにはどうすればよいのでしょうか。たとえば、元のリストがありますが、特定の長さ( 〜 )["2H", "AH", "KH", "QH", "JH", "0H", "9H"]の新しいさまざまなリストがすべて含まれている最終的なリストを作成する方法はありますか?35

基本的に、上記の元のリストから、以下に示すような返されるリストが必要です。

[['9H', '0H', 'JH'], ['0H', 'JH', 'QH'], ['JH', 'QH', 'KH'], ['QH', 'KH', 'AH'], 
['KH', 'AH', '2H'], ['9H', '0H', 'JH', 'QH'], ['0H', 'JH', 'QH', 'KH'], 
['JH', 'QH', 'KH', 'AH'], ['QH', 'KH', 'AH', '2H'], ['9H', '0H', 'JH', 'QH', 'KH'], 
['0H', 'JH', 'QH', 'KH', 'AH'], ['JH', 'QH', 'KH', 'AH', '2H']]

ありがとう!

4

2 に答える 2

3
>>> from itertools import islice, chain
>>> L = ["2H", "AH", "KH", "QH", "JH", "0H", "9H"]
>>> list(chain.from_iterable(
        zip(*[islice(reversed(L),i,None) for i in range(j)])
        for j in range(3,6)))
[('9H', '0H', 'JH'), ('0H', 'JH', 'QH'), ('JH', 'QH', 'KH'), ('QH', 'KH', 'AH'), 
 ('KH', 'AH', '2H'), ('9H', '0H', 'JH', 'QH'), ('0H', 'JH', 'QH', 'KH'), 
 ('JH', 'QH', 'KH', 'AH'), ('QH', 'KH', 'AH', '2H'), ('9H', '0H', 'JH', 'QH', 'KH'),
 ('0H', 'JH', 'QH', 'KH', 'AH'), ('JH', 'QH', 'KH', 'AH', '2H')]

説明

このソリューションは、の使用に基づいていますzip

>>> zip(L,L)
[('2H', '2H'), ('AH', 'AH'), ('KH', 'KH'), ('QH', 'QH'), ('JH', 'JH'), ('0H', '0H'), ('9H', '9H')]

zipこれは、各パラメーターからアイテムをまとめて取得することにより、どのように機能するかの例を示しています。

>>> zip(L,L[1:])
[('2H', 'AH'), ('AH', 'KH'), ('KH', 'QH'), ('QH', 'JH'), ('JH', '0H'), ('0H', '9H')]

2番目のパラメータと同じリストの最初のアイテムから開始することで、2つのアイテムごとに取得できます。

>>> zip(L,L[1:],L[2:])
[('2H', 'AH', 'KH'), ('AH', 'KH', 'QH'), ('KH', 'QH', 'JH'), ('QH', 'JH', '0H'), ('JH', '0H', '9H')]

3アイテムごとに同じです。

>>> zip(*[L[i:] for i in range(3)])
[('2H', 'AH', 'KH'), ('AH', 'KH', 'QH'), ('KH', 'QH', 'JH'), ('QH', 'JH', '0H'), ('JH', '0H', '9H')]

これを自動的に行うには、*(スプラット)を使用zipしてリスト内包からの引数を取得できます。

この例では、結果が逆になるためreversed、リスト全体で逆イテレータを使用します。イテレータをスライスするにはislice、itertoolsからを使用する必要があります。isliceiterableに続いて、スライスを開始するためのインデックスと、スライスを終了するためのインデックスを取ります。Noneiterableの最後まで使用できます。

>>> zip(*[islice(reversed(L),i,None) for i in range(3)])
[('9H', '0H', 'JH'), ('0H', 'JH', 'QH'), ('JH', 'QH', 'KH'), ('QH', 'KH', 'AH'), ('KH', 'AH', '2H')]

つまり、3つのアイテムごとにすべての結果が得られます。これで、4項目と5項目ごとに必要になるため、この操作は、、およびに対して実行さrange(3)range(4)ますrange(5)

(zip(*[islice(reversed(L),i,None) for i in range(j)]) for j in range(3,6))

3これにより、、、のそれぞれのリストを持つジェネレーターが得られますが45それらはすべて1つのリストである必要があります。chain.from_iterableそれらは、結果がに変換されるとともに連鎖させることができますlist

于 2012-05-19T05:48:30.827 に答える
-1

itertoolsを使用する

import itertools

original = ["2H", "AH", "KH", "QH", "JH", "0H", "9H"]

result = itertools.chain()
for size in range(3, 6):
    curr_subsets = itertools.combinations(original, size)
    result = itertools.chain(result, curr_subsets)

result_as_list = list(result)
于 2012-05-19T05:49:05.160 に答える