3

是否可以在将 n 个项目添加到新列表时停止列表理解?

例如,

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

确认:我想将结果列表的长度限制为 10。“”是当前列表的伪代码。我使用python 2.7

4

3 回答 3

12

不,但是itertools.islice()可以给你一个只产生给定数量的项目的生成器。

>>> list(itertools.islice('foobar', 3))
['f', 'o', 'o']
于 2012-10-04T20:22:04.987 回答
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]”等。

于 2012-10-04T20:33:48.497 回答
1

如果xrange是您使用的生成器,请执行

list(xrange(20))[:10]
于 2012-10-04T20:27:29.517 回答