繁体   English   中英

将列表理解转换为循环

[英]convert list comprehension into loop

我正在尝试将列表理解转换为 for 循环。 lst = [ x**2 for x in [x**2 for x in range(11)] ]

我试过下面的代码

lst = []
for x in range(1):
  for x in range(11):
    lst.append(x**4)
print lst

但这与x**2x**2不匹配。 在我的代码中,没有x**2两次

lst = []
for x in range(1):
   for x in range(11):
       lst.append(x**4)
print lst

有人可以帮助x**2出现两次的 for 循环吗?

在列表推导中,内部推导的x与外部作用域中的同名变量不同。 当您展开它时,变量在同一范围内,因此它们不能使用相同的名称。

lst = []
for y in range(1):
  for x in range(11):
    lst.append(x**4)
print(lst)

但是,当然,您不需要两个循环 - 对具有单个元素的静态列表进行循环是完全没有意义的。

如果你坚持要x**2两次,那当然也可以:

lst = []
for x in range(11):
    x = x ** 2
    lst.append(x**2)

但是展开理解和分解x**2在我看来都是不必要的更改。 这很简单,任何有能力的程序员都应该可以理解; 如果某些事情看起来特别不明显,可以添加评论。

顺便说一句,如果您只是在学习基础知识,那么您可能应该忽略 Python 2,而将时间花在该语言的当前推荐和支持的版本上,即 Python 3。

干得好,

lst = []
for x in range(11):
    x = x**2
    lst.append(x**2)

这与,

for x in range(11):
    lst.append(x**4)

输出:

[0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]

如果您非常特别需要使用嵌套for循环和x**2两次,那么您可以尝试以下代码,

lst = []
for x in range(11):
    lst.append(x**2) # appends squared of x to the lst 
    for x in [lst[-1]]: # loops (one iteration) using the last inserted item of the list `lst`
        lst[-1] = x**2 # performs squared operation on the x value again and update the value in lst
print lst

输出:

[0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]

这里查看所有操作。

我会尽力解释哪里出了问题

lst = [ x**2 for x in [x**2 for x in range(11)] ]
print(lst)
# outputs [0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]

为了在不使用列表理解的情况下获得相同的结果,您可以做的是将其拆分为 2 个列表。 嵌套列表和输出列表。

lst2= []
nestedlist = []
for x in range(11):
  nestedlist.append(x**2)
for x in nestedlist:
  x = x**2
  lst2.append(x)

print(lst2)
# outputs [0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]

注意在列表推导式中内部列表是如何在外部列表之前首先迭代的。 同样的逻辑适用于这个“拆分”版本。

这样做的原因如下:是错误的

lst2= []
nestedlist = []
for x in range(11):
  nestedlist.append(x**2)
  for x in nestedlist:
    lst2.append(x**2)

print(lst2)
#outputs [0, 0, 1, 0, 1, 16, 0, 1, 16, 81, 0, 1, 16, 81, 256, 0, 1, 16, 81, 256, 625, 0, 1, 16, 81, 256, 625, 1296, 0, 1, 16, 81, 256, 625, 1296, 2401, 0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]

是因为当你在做以下事情时,

  for x in nestedlist:
    lst2.append(x**2)

您实际上正在做的是应用**2列表的长度 因此输出例如 [0,1] 到 [0,1,0,1],而不是列表中的元素。

我想列表理解在这个意义上是聪明的。

lst =[]
tmp = []
for x in range(11):
    tmp.append(x**2)

for x in tmp:
    lst.append(x**w) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM