>>> 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からを使用する必要があります。islice
iterableに続いて、スライスを開始するためのインデックスと、スライスを終了するためのインデックスを取ります。None
iterableの最後まで使用できます。
>>> 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
これにより、、、のそれぞれのリストを持つジェネレーターが得られますが4
、5
それらはすべて1つのリストである必要があります。chain.from_iterable
それらは、結果がに変換されるとともに連鎖させることができますlist
。