web-dev-qa-db-ja.com

Pythonで2D座標マップを作成する

私は解決策を探していません。より良い解決策を探しているか、他の種類のリスト内包表記などを使用してこれを行うための別の方法を探しています。

[(1、1)、(1、2)、...、(x、y)]のようなマップ座標を取得するには、2つの整数のタプルのリストを生成する必要があります。

だから私は以下を持っています:

width, height = 10, 5

ソリューション1

coordinates = [(x, y) for x in xrange(width) for y in xrange(height)]

ソリューション2

coordinates = []
for x in xrange(width):
    for y in xrange(height):
        coordinates.append((x, y))

解決策

coordinates = []
x, y = 0, 0
while x < width:
    while y < height:
        coordinates.append((x, y))
        y += 1
    x += 1

他に解決策はありますか?私は最初のものが一番好きです。

13
aemdy

itertools.product() を使用する:

from itertools import product
coordinates = list(product(xrange(width), xrange(height)))
16
Andrew Clark

最初の解決策は洗練されていますが、リスト内包表記の代わりにジェネレータ式を使用することもできます。

((x, y) for x in range(width) for y in range(height))

これは、データをどのように処理しているかによっては、その場で値を生成し、それらをどこにも保存しないため、より効率的な場合があります。

これにより、ジェネレーターも生成されます。いずれの場合も、データをリストに変換するにはlistを使用する必要があります。

>>> list(itertools.product(range(5), range(5)))
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), 
 (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), 
 (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]

Python 2を使用している場合は、おそらくxrangeを使用する必要がありますが、Python 3、range結構です。

5
senderle

更新:ベンチマークに@F.J。の回答を追加

最初の実装は最もPython的な方法であり、最速のようです。幅と高さのそれぞれに1000を使用して、の実行時間を登録します。

  1. 0.35903096199s
  2. 0.461946964264s
  3. 0.625234127045s

@ F.J 0.27s

そうそう、彼の答えは最高です。

0
Zenon