ネストループは使用しないでください。 A
とB
をペアにし、必要に応じてB
を繰り返します。常にA
の半分のサイズであることを行っている
from itertools import cycle
zip(A, cycle(B))
B
場合、あなたはB
だけのダブルもできます:
必要なもの(
B
を繰り返す)
zip()
(ペアリングを行うために)、および
itertools.cycle()
です
zip(A, B + B)
デモ:長くなる1知られていない場合のために
>>> from itertools import cycle
>>> A = [70, 60, 50, 40, 30, 20, 10, 0]
>>> B = [1, 2, 3, 4]
>>> zip(A, cycle(B))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
>>> zip(A, B + B)
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
すべては、サイクルそれらを、対合する
zip(max((A, B), key=len), cycle(min((A, B), key=len))
やリストの任意の数のが、最大の長さに物事を制限するitertools.islice()
を使用します:リスト、あなたはサイクルのどちらを選択するmin()
とmax()
を使用することができ
inputs = (A, B) # potentially more
max_length = max(len(elem) for elem in inputs)
zip(*(islice(cycle(elem), max_length) for elem in inputs))
デモ:
>>> from itertools import islice
>>> inputs = (A, B) # potentially more
>>> max_length = max(len(elem) for elem in inputs)
>>> zip(*(islice(cycle(elem), max_length) for elem in inputs))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
これは完璧です。どうもありがとうございます。私はzip()関数を使ってみましたが、len(B)までしかペアを受け取っていませんでした。私はzip(A、B + B)を行うことができるかどうか分からなかった。 –
@ A.K: 'zip()'は最短で終了します。そのトリックは、「A」を最短にすることです。 –
任意の数字の場合の別の方法は、zipの**外部**にisliceを使用することです: 'list(islice(zip(* map(cycle、inputs))、max(map(len、inputs))))' 。 –