【发布时间】: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)?
正常的列表推导以这种方式发生:
new_list = [f(x) for x in l]
在 Python 中创建类似这样的新列表的最简洁易读的方法是什么:
new_list = [f(x) while condition is True]
【问题讨论】:
我可能会将它包装在生成器函数中:
def generate_items():
while condition:
yield f(x)
new_list = list(generate_items)
【讨论】:
takewhile 编写一个版本,但没想到已经存在一些可迭代对象,然后发现自己正在制作一个生成器(那时我认为 @Duncan 的答案是一个明显的赢家)。
保持简单:
new_list = []
while condition:
new_list.append(f(x))
如果将某些内容更清楚地写为单独的语句,则将其强制为单个表达式没有任何好处。
【讨论】:
x 在迭代期间不会发生变化,如果它实际上是创建 some_iterable 将不会是微不足道的.另外,我认为有趣的是,没有人会选择您选择的语法 =)
使用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)。