当新列表中添加n个项目时,是否有可能使列表推导停止?
例如:
[x for x in xrange(20) if len(<this>) < 10 ]
确认一下:我想将结果列表的长度限制为10。"" 是当前正在生成的列表的伪代码。我正在使用Python 2.7。
当新列表中添加n个项目时,是否有可能使列表推导停止?
例如:
[x for x in xrange(20) if len(<this>) < 10 ]
确认一下:我想将结果列表的长度限制为10。"" 是当前正在生成的列表的伪代码。我正在使用Python 2.7。
itertools.islice()
可以给你一个生成器,该生成器仅产生给定数量的项。>>> list(itertools.islice('foobar', 3))
['f', 'o', 'o']
这是可以做到的,但它取决于你使用的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]
" 等。
xrange
,只需执行以下操作:list(xrange(20))[:10]
xrange()
替换为无限生成器,则永远不会有机会对其进行切片。 - Ignacio Vazquez-Abrams