web-dev-qa-db-ja.com

2つのリストを反復して、各反復から各リストから1つの要素を取得するより良い方法はありますか?

緯度のリストと経度の1つがあり、緯度と経度のペアを反復処理する必要があります。

より良いですか:

  • A.リストの長さが等しいと仮定します。

    for i in range(len(Latitudes):
        Lat,Long=(Latitudes[i],Longitudes[i])
    
  • B.または:

    for Lat,Long in [(x,y) for x in Latitudes for y in Longitudes]:
    

(Bは正しくないことに注意してください。これにより、itertools.product()と同等のすべてのペアが得られます)

それぞれの相対的なメリットについての考え、またはどちらがよりパイソン的ですか?

129
chongman

これはあなたが得ることができる限りPythonicです:

for lat, long in Zip(Latitudes, Longitudes):
    print lat, long
246

これを行う別の方法は、mapを使用することです。

>>> a
[1, 2, 3]
>>> b
[4, 5, 6]
>>> for i,j in map(None,a,b):
    ...   print i,j
    ...
1 4
2 5
3 6

Zipと比較したマップの使用における1つの違いは、Zipでは新しいリストの長さが
最短リストの長さと同じです。例えば:

>>> a
[1, 2, 3, 9]
>>> b
[4, 5, 6]
>>> for i,j in Zip(a,b):
    ...   print i,j
    ...
1 4
2 5
3 6

同じデータでマップを使用する:

>>> for i,j in map(None,a,b):
    ...   print i,j
    ...

    1 4
    2 5
    3 6
    9 None
47
sateesh

こちらの回答でZipに対する多くの愛情を見ることができます。

ただし、3.0より前のpythonバージョンを使用している場合、標準ライブラリのitertoolsモジュールには、イテレートを返すizip関数が含まれていることに注意してください。この場合(特に、latt/longsのリストが非常に長い場合)。

python 3以降ではZipizipのように動作します。

21
Wogan

緯度と経度のリストが大きく、遅延ロードされる場合:

from itertools import izip
for lat, lon in izip(latitudes, longitudes):
    process(lat, lon)

または、forループを避けたい場合

from itertools import izip, imap
out = imap(process, izip(latitudes, longitudes))
15
JudoWill

2つのリストの要素を同時に反復処理することはzip圧縮と呼ばれ、pythonはそのための組み込み関数を提供します。これは文書化されています here .

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = Zip(x, y)
>>> zipped
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = Zip(*zipped)
>>> x == list(x2) and y == list(y2)
True

[pydocsからの例]

あなたの場合、それは単純になります:

for (lat, lon) in Zip(latitudes, longitudes):
    ... process lat and lon
6
notnoop
for Lat,Long in Zip(Latitudes, Longitudes):
5
John La Rooy

この投稿は、Zip()に役立ちました。数年遅れていることは知っていますが、まだ貢献したいと思っています。これはPython 3にあります。

注:python 2.xでは、Zip()はタプルのリストを返します。 Python 3.xでは、Zip()は反復子を返します。 itertools.izip() in python 2.x == Zip() in python 3.x

タプルのリストを作成しているように見えるので、次のコードはあなたがしていることを達成しようとする最もPython的な方法です。

>>> lat = [1, 2, 3]
>>> long = [4, 5, 6]
>>> Tuple_list = list(Zip(lat, long))
>>> Tuple_list
[(1, 4), (2, 5), (3, 6)]

または、より複雑な操作が必要な場合は、list comprehensions(またはlist comps)を使用できます。リストの内包表記もmap()とほぼ同じ速度で実行され、数ナノ秒を与えたり受けたりします。また、Python [ic]対map()と見なされるものの新しい基準になりつつあります。

>>> lat = [1, 2, 3]
>>> long = [4, 5, 6]
>>> Tuple_list = [(x,y) for x,y in Zip(lat, long)]
>>> Tuple_list
[(1, 4), (2, 5), (3, 6)]
>>> added_tuples = [x+y for x,y in Zip(lat, long)]
>>> added_tuples
[5, 7, 9]
3
dysfunctional