可以在列表推导式中使用while循环生成数据吗?

4

你能否只使用while语句在列表推导式中生成一个列表?

使用for的列表推导式:

r =  [i for i in range(0,5)]

r = [0, 1, 2, 3, 4]

使用while循环是否可以构建这个列表?

原型:

i=0
print [i+=1 while i<5]

2
不,列表推导式中不允许使用语句。不过可以查看 itertools.takewhile - Ashwini Chaudhary
谢谢大家的评论,“while不生成序列”是一个很好的提示。 - user1767754
3个回答

1
在列表推导式中,你不能完全按照自己的意愿生成元素;但是,如果你想要在满足某些条件时生成一些元素,最好从所需内容创建一个生成器(按需产生项),然后使用 itertools.takewhile 过滤你的生成器。
>>> from itertools import takewhile
>>> list(takewhile(lambda x:x<5,range(5))) #in python 2.X pass an Xrange  
[0, 1, 2, 3, 4]

所以,对于范围而言,实际上已经是上述语句的一种非常紧凑的形式。谢谢kasramvd。 - user1767754

1

另一种选择是使用 yield。对于更复杂的操作,这样做可以更简单且整体上更易于维护:

def generate_less_than(val):
    i = 0
    while i < val:
        yield i
        i += 1

r = list(generate_less_than(5))

这样做的好处是可以为您提供一个易于重复使用的生成器,这意味着您可以让应用程序的不同部分决定它们是否只需要迭代生成器还是需要一个list。参数化也很简单。

-1

你已经走在了正确的道路上。这个代码可以正常工作:

print [i for i in range(5)]

你可能也会喜欢“一次性”变量——下划线:

print [_ for _ in range(5)]

这适用于列表推导式和其他上下文中,索引仅在迭代范围内使用的情况。


1
你能详细说明一下“一次性”变量吗? - Ketan Maheshwari
@Ketan,你在哪里卡住了?在发表评论之前,你确实搜索了用法,对吧?我希望你找到了SO的解释和其他网上的资料。 - Prune
1
@Ketan,“_”变量是Python中的一种约定。它用于表示“我不关心这个值,也永远不会使用它。”通常情况下,当某个函数返回一个元组并且您只关心部分结果时,就会使用它,例如:first_val,_,third_val = func_returns_3_tuple()。我认为该变量的约定在这里不适用,因为您正在列表推导式中使用该值。 - jpmc26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接