使用Python创建2D坐标地图

13

我不是在寻找解决方案,而是希望通过使用其他类型的列表推导式或其他方法来找到更好的解决方案或只是另一种不同的方法。

我需要生成一个由两个整数元素组成的元组列表,以获取映射坐标,如[(1, 1),(1, 2),...,(x, y)]。

所以我有以下代码:

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))

解决方案 3

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

还有其他的解决方案吗?我最喜欢第一个。


2
我非常肯定方案1是你能想到的最好的。 - hochl
你打算用坐标列表做什么? - Russell Borogove
一开始,我只是将它们写入数据库,以生成2D浏览器游戏的RPG地图。 - aemdy
使用列表推导式的第一种解决方案+1... - Soask
3个回答

17

使用itertools.product()

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

itertools 是计算机编程中的救星。 - cheeken
+1. 我会将它放在一个函数中,这样你只需要传入宽度和高度就可以得到列表。 - asthasr
好的,我刚刚进行了一些测试并得出以下结论:使用列表推导式创建生成器而不使用[]是最快的方法,但如果之后我们要循环遍历数据,那么你的方法会更快。谢谢! :) - aemdy

6
第一个解决方案很优雅,但你也可以使用生成器表达式来代替列表推导式:
((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就可以了。

1
itertools.product 类中使用 xrange 会更加内存高效,就像 F.J. 所做的那样。 - Niklas R
2
@NiklasR,假设这是Python 2。如果是Python 3,则xrange不再存在。不过我会添加一条注释。 - senderle

-1

更新:在基准测试中添加了@F.J.的答案

第一种实现方式是最符合Python风格的,而且似乎也是最快的。 使用1000作为宽度和高度,我记录了执行时间。

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

@F.J 0.27秒

所以,他的答案是最好的。


2
我假设第一种实现是F.J.的itertools解决方案?并且您应该为数字提供更好的描述。 - LWZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接