2013-01-12 4 views
15

は、通常、私はそうのようにこれを行うだろうab2つの配列を同時にループするためのpythonの方法は何ですか?</p> <pre><code>for i in range(len(a)): print a[i] + b[i] </code></pre> <p>ではなく、何かを: - 私は、同じ長さの2つの配列を、持っている場合

a = [4,6,2,6,7,3,6,7,2,5]

b = [6,4,6,3,2,7,8,5,3,5]

を言いますこのように:

i=0 
for number in a: 
    print number + b[i] 
    i += 1 

私は使用された方法と一貫していることを好みます。

私はzipを知っていますが、決して使用しません。これはzipさんのために作られたものですか?

for pair in zip(a,b): 
    print pair[0] + pair[1] 

はこれを行うには神託の方法だろうか?

答えて

17

リストabが短い場合には、(@Vincenzo PIIがあったとして)zipを使用します。

for x, y in zip(a, b): 
    print(x + y) 

リストabが長い場合は、メモリを節約するためにitertools.izipを使用します。

import itertools as IT 
for x, y in IT.izip(a, b): 
    print(x + y) 

zipは、タプルのリストを作成します。 abが大きい場合、これは負担(メモリ)になります。

itertools.izipはイテレータを返します。イテレータはタプルの完全なリストを生成しません。 forループによって要求されたときにのみ、各項目を生成します。したがって、それはあなたにいくつかのメモリを節約できます。

短いリストのzip(a,b)をPython2で呼び出すと、itertools.izip(a,b)を使うよりも速くなります。しかし、Python3では、zipはデフォルトでイテレータを返します(つまり、Python2ではitertools.izipと同等です)。関心の


その他の変種:

+1

これを完全にするために、私は 'future_builtins'についても言及したいと思います。 – georg

+0

したがって、python3のzipはitertools.izipと同じですか?それとも、リストのサイズによって変わるのですか? – will

+2

@will:はい、Python3の 'zip'はPython2の' itertools.izip'と同じです。 (リストのサイズに応じて動作が変わることはありません)Python3で古い 'zip'動作を得るには' list(zip(a、b)) 'を使います。 – unutbu

7

あなた自身を述べたように可能な解決策は、zipを使用していますが、若干異なりますが、質問でそれを書いた方法より:

for x, y in zip(a, b): 
    print x, y 

お知らせzip()で返されるタプルのリストの長さが等しくなりますabの間の最小値に設定します。これは、abが同じ長さでない場合に影響します。

+0

これは非常に見覚えがありません様々な例とドキュメントのページから – will

+0

それはpythonic :)を確認します! –

4

代わりのzipを使用して、あなたはスピードが重要であり、あなたが長い配列を持っている場合は特に、Numpyを使用することができます。そのはるかに速く、あなたがnumpyの配列を使用しているたら、ループを必要としない、とだけ書くことができます。

print a + b 

示すグラフは、郵便番号、izip、およびnumpyのを使用して、異なる長さのリストを合計するためのタイミングを平均化: enter image description here

+1

ええ、私はナンピーについて知っています。この例では間違いなく適用可能ですが、私が与えた例は単なる考案されたものでした。私が本当に欲しいのは、オブジェクトのリストが2つあり、両方のオブジェクトのn番目にアクセスしたいときです。 'matplotlib' piechartの' wedges'に 'hatch'パターンを追加したかったのは明らかでした。最終的な使用方法は 'pattern、wedge in zip(pattern、wedges)のようなものです:wedge.set_hatch(pattern)' – will

0

numpy以降の完全性のためにこの答えを提供することについては、別の答えで議論されており、上位のランク付けされた配列から値を組み合わせることはしばしば有用です。

accepted answer配列がlistlistのSのように、また、そのようなランク2以上のnumpyアレイなどの複数のレベル(であるが、場合しかし、ランク1の任意の配列/アレイの素晴らしい作品、またはtuple,tuple)、各ランクを反復する必要があります。以下2D numpyアレイを有する例である:

import numpy as np 
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
b = np.array([list('abc'), list('pdq'), list('xyz')]) 
c = np.array([[frobnicate(aval, bval) for aval, bval in zip(arow, brow)] for arow, brow in zip(a, b)]) 

同じ概念は、同一形状の二次元のネストされた配列の任意のセットのために動作します:一つまたはネストされた両方の場合

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
b = [list('abc'), list('pdq'), list('xyz')] 
c = [[frobnicate(aval, bval) for aval, bval in zip(arow, brow)] for arow, brow in zip(a, b)] 

シーケンスがその中に「穴」があり、穴を埋めるためにitertools.zip_longestを使用(Noneにフィル値はデフォルトではなく指定することができます):

from itertools import zip_longest as zipl 
a = [[], [4, 5, 6], [7, 8, 9]] # empty list in the first row 
b = [list('abc'), list('pdq'), []] # empty list in the last row 
c = [[frobnicate(aval, bval) for aval, bval in zipl(arow, brow)] for arow, brow in zipl(a, b)] 
関連する問題

 関連する問題