Python列表推导式设置最大长度

3

当新列表中添加n个项目时,是否有可能使列表推导停止?

例如:

[x for x in xrange(20) if len(<this>) < 10 ]

确认一下:我想将结果列表的长度限制为10。"" 是当前正在生成的列表的伪代码。我正在使用Python 2.7。


在上述情况下,<this> 看起来是对当前正在构建的列表的伪代码引用。 - Mike Corcoran
我仍然不理解这个问题。 - user647772
@Tichodroma 他只想要前10个项目,例如。 - Gareth Latty
1
如果您将xrange()替换为无限生成器,则永远不会有机会对其进行切片。 - Ignacio Vazquez-Abrams
所以也许@rikAtee应该编辑问题,给我们一些关于使用的生成器的线索。 - user647772
显示剩余2条评论
3个回答

12
不行,但是 itertools.islice() 可以给你一个生成器,该生成器仅产生给定数量的项。
>>> list(itertools.islice('foobar', 3))
['f', 'o', 'o']

3
做这件事最简单的一般方法是。值得注意的是,如果您使用序列作为源,则可以使用普通的列表切片。 - Gareth Latty

2

这是可以做到的,但它取决于你使用的Python实现方式,因为它取决于列表推导式的实现。在CPython中,“这个列表推导式”的名称是“_[1]”,所以例如你可以执行以下操作(自行尝试,它真的会起作用):

[i for i in xrange(20) if len(locals().get("_[1]")) < 10]

在实际生产代码中,这种做法是非常不可取的。它过于晦涩难懂,而且如果有人使用其他实现方式,可能会出现问题。相反,只需使用循环:

l = []
for i in xrange(20):
    l.append(i)
    if len(l) >= 10:
         break

locals().get("_[1]") 的作用是因为在列表推导式构建过程中,Python 需要将当前列表存储在某个位置。"_[1]" 被选择是因为很少有人会将其用作变量名。如果您构建了一个嵌套的列表推导式,则这些推导式将使用更高的自增变量名称存储列表,例如 "_[2]"、"_[3]" 等。


1
如果您使用的是生成器xrange,只需执行以下操作:
list(xrange(20))[:10]

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