【问题标题】:Duplicating list items variable number of times with list comprehension使用列表理解重复列表项可变次数
【发布时间】:2016-10-29 11:22:14
【问题描述】:

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

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]

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

【问题讨论】:

  • 您的第一个理解[i for _ in range(i) for i in y] 将在执行时出错(即name 'i' is not defined)。在嵌套列表推导中,循环是由外而内的。
  • @Rahul 它不会引发该错误,因为前面几行中的for 循环会泄漏i 的值。

标签: python list


【解决方案1】:
x = [j for j in y for i in range(j)]

【讨论】:

  • 这段代码有点混乱,因为它重复使用了y。此外,在您的代码中添加一些解释总是更好。没有解释的纯代码答案的用处有限。
【解决方案2】:

当列表解析中有多个 for 循环时,这些循环的处理顺序与使用“传统”for 循环的顺序相同。提供正确输出的列表 comp 的循环顺序与开始时使用 .append 和传统 for 循环的代码相同。

正如 Rahul 在 cmets 中提到的,孤立地,

x = [i for _ in range(i) for i in y]

会给一个

NameError: name 'i' is not defined

在这种情况下不会,因为i 是由早期代码定义的。


相比之下,看看嵌套列表组合会发生什么:

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 的每次迭代,我们都会创建一个新的列表组合,并在该列表组合中循环range(i)

【讨论】:

    【解决方案3】:

    正确的理解是:

    x = [i for i in y for j in range(i)]
    

    这会给出你想要的结果
    列表范围内项目的项目(项目)次
    灵感来自thread

    flattened = [val for sublist in list_of_lists for val in sublist]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-17
      • 2021-04-15
      • 1970-01-01
      • 2017-06-05
      • 2012-05-19
      • 2019-08-13
      • 1970-01-01
      相关资源
      最近更新 更多