2016-02-05 4 views
10

サイズnとn/2の2つの異なる配列からのコンテンツをすばやく生成しようとしています。例として:私は異なる範囲の2つの変数でPythonのリストの理解を試みる

[(A[x], B[y]) for x in range(len(A)) for y in range(len(B))] 

のようなものを生成したい

A = [70, 60, 50, 40, 30, 20, 10, 0] 
B = [1, 2, 3, 4] 

私は文のための第二は、「X」の後にforループをネストされている理解しています。私は新しい配列の内容を取得しようとしています

A[0], B[0] 
A[1], B[1] 
A[2], B[2] 
A[3], B[3] 
A[4], B[0] 
A[5], B[1] 
A[6], B[2] 
A[7], B[3] 

誰かが正しい方向に向いていますか?

答えて

20

ネストループは使用しないでください。 ABをペアにし、必要に応じて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)] 
+0

これは完璧です。どうもありがとうございます。私はzip()関数を使ってみましたが、len(B)までしかペアを受け取っていませんでした。私はzip(A、B + B)を行うことができるかどうか分からなかった。 –

+1

@ A.K: 'zip()'は最短で終了します。そのトリックは、「A」を最短にすることです。 –

+0

任意の数字の場合の別の方法は、zipの**外部**にisliceを使用することです: 'list(islice(zip(* map(cycle、inputs))、max(map(len、inputs))))' 。 –

5

が一つだけのループの代わりに、2とサイコーのために使用してみてくださいgは、その長さを過ぎると0に戻ります。

これは、Aが長いリストの場合にのみ機能することに注意してください。あなたはBは常にAの半分のサイズになります知っていればあなたもこれを使用することができます:

list(zip(A, B*2)) 
10

[(A[x % len(A)], B[x % len(B)]) for x in range(max(len(A), len(B)))]

これはAの方が大きいリストがあるかどうか動作します。 :)

+0

まさに私が言うことは、良い答えです。 – AMACB

関連する問題