私は解決策を探していません。より良い解決策を探しているか、他の種類のリスト内包表記などを使用してこれを行うための別の方法を探しています。
[(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
他に解決策はありますか?私は最初のものが一番好きです。
itertools.product()
を使用する:
from itertools import product
coordinates = list(product(xrange(width), xrange(height)))
最初の解決策は洗練されていますが、リスト内包表記の代わりにジェネレータ式を使用することもできます。
((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
結構です。
更新:ベンチマークに@F.J。の回答を追加
最初の実装は最もPython的な方法であり、最速のようです。幅と高さのそれぞれに1000
を使用して、の実行時間を登録します。
0.35903096199s
0.461946964264s
0.625234127045s
@ F.J 0.27s
そうそう、彼の答えは最高です。