【问题标题】:Two for loops in list comprehension produce weird output in Python列表理解中的两个 for 循环在 Python 中产生奇怪的输出
【发布时间】:2022-01-02 07:15:20
【问题描述】:

我已经写了这段代码:

l1 = [1, 2, 3, 4]
l2 = [5, 6, 7, 8]

print([x**2 for x in l1 for y in l2])

输出这个:

[1, 1, 1, 1, 4, 4, 4, 4, 9, 9, 9, 9, 16, 16, 16, 16]

我的问题是,这个列表理解中发生了什么?为什么l1中的item数量乘以l2的长度?

【问题讨论】:

  • 这能回答你的问题吗? List comprehension on a nested list?
  • 你希望两个for 子句做什么?
  • 因为对l2的每个元素的理解都要经过l1,即l2次,所以一共有l2*l1的结果。
  • 如果这让您觉得“奇怪”——您所期待的非奇怪结果是什么?
  • 请注意,第二个列表是无用的,只有它的长度很重要。 print([x**2 for x in l1 for _ in range(4)]) 你会得到同样的结果

标签: python list for-loop list-comprehension


【解决方案1】:

就像你做的那样:

for x in l1:
   for y in l2: #this loop has len(l2) iteration
      print(x**2)

y 循环中,您只使用变量x,在len(l2) 迭代中不会改变。

【讨论】:

    【解决方案2】:

    这里发生了两件事。

    第一:print([x**2 for x in l1...

    这是获取 l1 中的每个元素并将它们平方生成[1, 4, 9, 16]

    二:... for y in l2])

    这是对 l2 中的每个值重复此过程(对 l1 中的元素进行平方和打印)一次,这就是为什么您会得到每个平方值的 4。

    【讨论】:

      【解决方案3】:

      您的列表理解等同于以下for 循环:

      result = []
      for y in l2:
          for x in l1:
              result.append(x**2)
      

      从这里你可以看到为什么内部循环重复了 4 次。

      如果您想并行循环遍历两个列表,而不是嵌套,请使用zip()

      [x**2 for x, y in zip(l1, l2)]
      

      【讨论】:

      • 我猜for循环的顺序被交换了。它不会产生与我的理解相同的结果:)
      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2019-12-04
      • 2018-10-28
      • 1970-01-01
      相关资源
      最近更新 更多