使用列表推导复制列表项可变次数

时间:2016-06-27 12:30:19

标签: python list

我基本上试图通过这个基本的代码使用列表理解来解决问题。我试图通过列表项的值复制列表项:

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]

我似乎无法理解为什么我为第二个例子得到了错误的输出。有人可以解释这里有什么问题。感谢。

3 个答案:

答案 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)]