我基本上试图通过这个基本的代码使用列表理解来解决问题。我试图通过列表项的值复制列表项:
y = [1, 2, 0, 1]
x = []
for i in y:
for j in range(i):
x.append(i)
# Desired output
>>> [1, 2, 2, 1]
x = [i for _ in range(i) for i in y]
# Wrong output
>>> [1, 2, 0, 1]
# Right output
x = [j for j in y for _ in range(j)]
>>> [1, 2, 2, 1]
我似乎无法理解为什么我为第二个例子得到了错误的输出。有人可以解释这里有什么问题。感谢。
答案 0 :(得分:3)
如果在列表推导中有多个for
循环,则循环的处理顺序与它们使用的顺序相同"传统" for
循环。提供正确输出的列表组件的循环顺序与开始时使用.append
传统for
循环的代码的顺序相同。
正如Rahul在评论中提到的那样,孤立地,
x = [i for _ in range(i) for i in y]
会给出一个
NameError: name 'i' is not defined
在这种情况下不会因为早期代码定义了i
。
相比之下,看看嵌套列表comp会发生什么:
y = [1, 2, 0, 1]
x = [[j for j in range(i)] for i in y]
print(x)
<强>输出强>
[[0], [0, 1], [], [0]]
这里,最外面的循环处于外部理解中,内部循环处于内部理解中。因此,对于for i in y
的每次迭代,我们创建一个新的列表comp,并在该列表中我们遍历range(i)
。
答案 1 :(得分:1)
正确的理解是:
x = [i for i in y for j in range(i)]
这给出了你想要的结果
列表范围(项目)中的项目项目
灵感来自thread
flattened = [val for sublist in list_of_lists for val in sublist]
答案 2 :(得分:-1)
x = [j for j in y for i in range(j)]