【问题标题】:More elegant way to create a list of 2D points in Python在 Python 中创建二维点列表的更优雅的方法
【发布时间】:2012-03-15 04:56:34
【问题描述】:

我需要在 python 中创建一个二维点 (x,y) 的列表。 这样就可以了

l = []

for x in range (30,50,5):
    for y in range (1,10,3):
        l.append((x,y))

所以:print l 将产生:

[(30, 1), (30, 4), (30, 7), (35, 1), (35, 4), (35, 7), (40, 1), (40, 4), (40, 7), (45, 1), (45, 4), (45, 7)]

有没有更优雅的方式来做到这一点?

【问题讨论】:

    标签: python list 2d


    【解决方案1】:

    使用itertools.product:

    from itertools import product
    l = list(product(range(30,50,5), range(1,10,3)))
    

    它的扩展性更好,应该比生成器表达式、列表理解或显式循环更快。

    【讨论】:

      【解决方案2】:
      l = [(x,y) for x in range(30,50,5) for y in range(1,10,3)]
      

      【讨论】:

        【解决方案3】:

        您可以使用generator expression

        >>> l = list((x, y) for x in range(30, 50, 5) for y in range(1, 10, 3))
        >>> l
        [(30, 1), (30, 4), (30, 7), (35, 1), (35, 4), (35, 7), (40, 1), (40, 4), (40, 7), (45, 1), (45, 4), (45, 7)]
        

        【讨论】:

        • 如果只是将生成器表达式转换为列表,则没有意义。
        • @srgerg:出于好奇 - 为什么将生成器表达式传递给 list() 而不是使用列表推导式?
        • 根据我的答案中链接到的python文档“生成器表达式......往往比等效的列表推导更容易记忆。”
        • @Dikei 是的,如果生成器表达式的结果被转换为一个列表,那么这只是一个列表推导。我将其转换为列表是因为问题要求提供列表结果,并且它使我能够显示表达式的结果。 OP 可能会删除转换为 list 并在他们自己的代码中使用更有效的生成器表达式,但如果没有更多上下文信息,我无法确定。
        • 谢谢。我认为这个解决方案很好。我只是从 C++ 切换到 Python,所以想学习“以 Python 方式”做事。我只需要生成要在图像中处理的像素位置列表。我使用列表是因为此处理的结果将生成一个有序列表,然后将对其进行分析、修剪、排序,结果是一个索引列表,指示您在原始列表中“想要”的像素。
        猜你喜欢
        • 2012-01-17
        • 1970-01-01
        • 2022-10-06
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多