【问题标题】:Python: Add item to list until a condition is truePython:将项目添加到列表中,直到条件为真
【发布时间】:2011-05-04 12:21:07
【问题描述】:

正常的列表推导以这种方式发生:

new_list = [f(x) for x in l]

在 Python 中创建类似这样的新列表的最简洁易读的方法是什么:

new_list = [f(x) while condition is True]

【问题讨论】:

  • 条件是x还是f(x)?

标签: list python


【解决方案1】:

我可能会将它包装在生成器函数中:

def generate_items():
    while condition:
        yield f(x)
new_list = list(generate_items)

【讨论】:

  • @Sven:对不起,请原谅我!
  • 我赞成否定 -1,因为我认为这可能是一个很好的答案。我尝试使用 takewhile 编写一个版本,但没想到已经存在一些可迭代对象,然后发现自己正在制作一个生成器(那时我认为 @Duncan 的答案是一个明显的赢家)。
【解决方案2】:

保持简单:

new_list = []
while condition:
    new_list.append(f(x))

如果将某些内容更清楚地写为单独的语句,则将其强制为单个表达式没有任何好处。

【讨论】:

  • 顺便说一句,这比其他答案更灵活,因为 OP 从未说过 x 在迭代期间不会发生变化,如果它实际上是创建 some_iterable 将不会是微不足道的.另外,我认为有趣的是,没有人会选择您选择的语法 =)
  • @Mu Ming:“我认为有趣的是,没有人会选择你选择的语法”现在你提到它,我发现命令式解决方案非常难看;-) 但我们绝对应该了解一下条件... 是在 x, f(x) 上,两者都不是?解决方案会有所不同。如果条件是 x,那么takewhile 提案对我来说看起来不错。
【解决方案3】:

使用itertools:

import itertools as it

new_list = map(f, it.takewhile(condition, l))

是一样的

new_list = [f(x) for x in it.takewhile(lambda x: condition(x), l)]

【讨论】:

  • 您可以跳过list-call 并使用map 而不是imap
  • takewhile(lambda x: condition(x), l) 可以写成takewhile(condition, l)
  • @Ben James - 它是在第一个版本中编写的。第二个更详细。
  • 我明白了。对我来说,它应该是答案的一个重要元素并不明显,因为无用的 lambdas 被使用了这么多
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2011-03-09
  • 2015-05-06
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多