注意:这是一个纯粹的代码高尔夫问题,所以我知道我的要求在生产中是不好的实践
我试图在列表推导式中修改一个数组,但出现了卡顿,我不知道为什么或如何修复它。
我正在处理一个深度未定的列表列表,并需要将它们压缩成一个平面列表 - 对于那些好奇的人,它是这个问题。但在这个阶段,让我们只说我需要一个列表中所有元素的平面列表,如果它是一个列表,则为0。
正常的方法是遍历列表,如果它是一个列表,则将其添加到末尾,如下所示:
for o in x:
if type(o)==type([]):x+=o
else:i+=o
print i
我正在尝试使用列表推导式来缩短这个代码,像这样。
print sum([
[o,x.append(o) or 0][type(o)==type([])]
for o in x
]))
现在,我知道
List.append
返回None,所以为了确保我得到一个数字值,惰性求值说我可以做x.append(o) or 0
,而且由于None
是“falsy”,它将评估第二部分,值是0
。但它并没有。如果我把
x.append()
放到对x
的列表推导中,它不会崩溃或出错,也不会返回迭代错误,它只会冻结。为什么append
在列表推导中冻结,但上面的for
循环正常工作?
from itertools import*
这段代码有22个字符,然后你需要调用实际的方法。这对于仅仅使用一个库来说是相当大的代价。 - user764357more-itertools
中,这就是为什么我在原始评论中说“像more-itertools
这样的第三方模块”。(我相信它被称为collapse
而不是flatten
,不幸的是这增加了1个字符...) - abarnertdef f(x):
try: yield from map(f, x)
except: yield x
这样的东西,它更长,并需要 Python 3.3+。 - abarnert