【问题标题】:Is there a way to write successive for loops in one line in Python?有没有办法在 Python 的一行中编写连续的 for 循环?
【发布时间】:2022-01-18 20:46:33
【问题描述】:

例如,我想创建一个包含 n 个 0 和 m 个 1 的集合,[0, 0, ...0, 1, 1, ..., 1]。有没有办法做类似[0 for i in range(n), 1 for j in range(m)] 的事情?

【问题讨论】:

  • 从 cmets 到答案,看起来您真正想做的是其他事情。你能给出背景并解释你的真正目标吗?

标签: python python-3.x list


【解决方案1】:

您可以分别创建两个列表,然后像这样添加它们:

[0 for i in range(n)] + [1 for j in range(m)]

或者简单地使用列表乘法:

[0]*n + [1]*m

【讨论】:

  • 好吧,我想没有办法将两个连续的for循环放在一行中吗?我的例子很糟糕。
  • @fishman11235 你可以将两个for循环放在一行中,但不能用逗号分隔它们,例如你可以做[x + y for x in range(n) for y in range(m)](这和你想做的不同)。
  • 然而,这是在做一个非常不同的事情(循环 n*m 次,而不是 n+m)
  • @mozway 我知道,这只是为了表明您可以在一行中放置两个(或更多)for 循环,不一定要解决 OP 问题。
  • @MrGeek 不,你不能。您最多可以在一行中放置 1 个 for 循环。您的代码中没有 for 循环。您有两个 list comprehensions,它们不是 for 循环。它们是另一种语言结构,一种表达式。而 for 循环是复合语句。这听起来可能很迂腐,但这毕竟是编程
【解决方案2】:

如果您想在不将两个列表添加在一起的情况下执行此操作(例如,如果 nm 非常大,并且您希望能够在不将其全部放入列表的情况下生成此序列),您可以使用条件迭代组合范围:

>>> n, m = 2, 3
>>> [0 if i < n else 1 for i in range(n + m)]
[0, 0, 1, 1, 1]

您也可以使用itertools.chain 将两个生成器“添加”在一起:

>>> from itertools import chain
>>> list(chain((0 for _ in range(n)), (1 for _ in range(m))))
[0, 0, 1, 1, 1]

【讨论】:

  • 正是我要建议的内容 ;) +1
【解决方案3】:

不要再想着用一条线来做事。考虑使用有用的、模块化的、可扩展的抽象。对于这类事情,itertools 提供了很多有用的抽象。

>>> from itertools import repeat, chain
>>> list(chain(repeat(0, 4), repeat(1, 3)))
[0, 0, 0, 0, 1, 1, 1]

通过组合较小的有用抽象开始构建您自己的有用抽象:

>>> from itertools import repeat, chain, starmap
>>> def builder(*pairs, consume=list):
...     return consume(chain.from_iterable(starmap(repeat, pairs)))
...
>>> builder((0,3), (1, 4), (2,1), (3, 6))
[0, 0, 0, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3]

虽然有时越简单越好,学习利用语言提供的各种语法糖:

>>> [*repeat(0, 4), *repeat(1, 3), *repeat(2,2)]
[0, 0, 0, 0, 1, 1, 1, 2, 2]

【讨论】:

  • 带有chain()repeat() 的选项对于长序列应该非常有效。
【解决方案4】:

你可以这样做:

lst = [0]*n+[1]*m

【讨论】:

  • 这会产生一个包含两个列表的元组。
  • 它现在应该可以工作了
【解决方案5】:

使用列表理解和 2 个 for 循环来解决您的问题的另一个潜在解决方案

n,m = 3,4
[i for i,n_numbers in enumerate((n,m)) for _ in range(n_numbers) ]

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2018-03-19
    • 2023-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多