【问题标题】:Understanding evaluation order of nested list comprehensions [duplicate]了解嵌套列表推导的评估顺序[重复]
【发布时间】:2016-12-22 15:27:35
【问题描述】:

我正在准备考试,我决定开始解决过去的考试。要求之一是了解代码的作用。但是我在使用这个注释时遇到了问题。

不明白这个嵌套循环是哪个结构,先执行哪个循环。

n = 10
p = [q for q in range(2, n) if q not in [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]]
print(p)

谁能帮我理解一下?

【问题讨论】:

  • this 有帮助吗?
  • 把它们写成常规循环,你就能很容易地弄清楚。

标签: python list python-3.x for-loop nested-loops


【解决方案1】:

如果您很难理解内部循环,请运行以下代码:

resultA = []
for x in ['x1', 'x2', 'x3']:
    for y in ['y1', 'y2', 'y3']:
        for z in ['z1', 'z2', 'z3']:
            resultA.append(''.join([x, y, z]))

print resultA

resultB = [''.join([x, y, z])
           for x in ['x1', 'x2', 'x3']
           for y in ['y1', 'y2', 'y3']
           for z in ['z1', 'z2', 'z3']
           ]

print resultB

print resultA == resultB

一旦你理解了这个代码理解列表成为你的第二天性,然后回到你的原始代码,你不会有任何问题:)

【讨论】:

    【解决方案2】:

    这相当于:

    list_i=[]
    for i in range(2, int(n**0.5)):
        for r in range(i*2, n, i):
            list_i.append(r)
    res=[]
    for q in range(2, n) :
        if q not in list_i:
            res.append(q)
    
    print res
    

    【讨论】:

      【解决方案3】:

      从评估开始:

      [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]
      

      归结为:

      [r for r in range(4, 10, 2)]
      

      因为range(2, int(n * 0.5)) 简化为具有单个元素[2] 的列表,该元素用作for r in range(i * 2, n, i) 语句中i 的值。所以内部列表理解计算为[4, 6, 8]

      然后,执行外部循环for q in range(2, n),并返回列表[2, 3, ..., 9]中不属于先前构造的列表的元素,即[4, 6, 8]

      # range(2, n) -> [2, 3, ..., 9]
      q for q in range(2, n) if q not in [..previously constructed list]     
      

      【讨论】:

      • 好吧,我现在明白了!!谢谢谢谢谢谢
      【解决方案4】:

      根据经验,最内层的循环将首先执行。

      考虑到这一点,让我们分解问题:

      [r for i in range(2, int(n**0.5)) for r in range(i * 2, n, i)]
      

      n**0.5 是 3.xxx,所以range(2, int(n**0.5)) 实际上是 range(2, 3),即 2(更多信息请参见 range)。

      所以i 无论如何都会是 2。

      r in range(i * 2, n, i) 现在看起来很简单,r 将介于 4 和 10(不包括在内)之间,步长为 2。可能的值是 4、6 和 8。

      问题变成了:

      p = [q for q in range(2, n) if q not in [4, 6, 8]]
      

      基本上都是2到10之间的奇数(不包括),加上数字2。

      【讨论】:

        猜你喜欢
        • 2012-10-09
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 2012-02-03
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        相关资源
        最近更新 更多