【问题标题】:Nested list comprehension where inner loop range is dependent on outer loop内循环范围取决于外循环的嵌套列表理解
【发布时间】:2016-09-13 20:32:39
【问题描述】:

我试图将以下内容表示为列表理解:

L = []
for x in range(n):
    for y in range(x):
        L.append( (x, y) )

我在更典型的矩阵场景中完成了嵌套列表理解,其中内循环范围不依赖于外循环。

我考虑过itertools 中可能有解决方案,使用product()chain(),但在那里也没有成功。

【问题讨论】:

  • 它在列表理解中运行良好,正如您所期望的那样。

标签: python python-3.x list-comprehension nested-loops


【解决方案1】:

请记住将x, y 括在括号中,这是唯一的一点警告,如果省略会导致SyntaxError

除此之外,翻译非常简单;推导式中fors 的顺序与嵌套语句的顺序类似:

n = 5
[(x, y) for x in range(n) for y in range(x)]

产生与其嵌套循环对应物相似的结果:

[(1, 0),
 (2, 0),
 (2, 1),
 (3, 0),
 (3, 1),
 (3, 2),
 (4, 0),
 (4, 1),
 (4, 2),
 (4, 3)]

【讨论】:

    【解决方案2】:

    列表推导旨在使该循环的直接翻译成为可能:

    [ (x,y) for x in range(3) for y in range(x) ]
    

    这不是你想要的吗?

    【讨论】:

      【解决方案3】:

      以下是将代码转换为列表理解的示例。

      >>> n = 10
      >>> [ (x,y) for x in range(n) for y in range(x)]
      [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (4, 3), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8)]
      

      或者,您可以使用itertools 库获得相同的结果(共享它只是为了您的知识信息,但不建议用于此问题陈述):

      >>> import itertools
      >>> list(itertools.chain.from_iterable(([(list(itertools.product([x], range(x)))) for x in range(n)])))
      [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (4, 3), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8)]
      

      【讨论】:

        猜你喜欢
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多