警告:这是代码打高尔夫球的一个直接问题,所以我知道我要问的是制作中的不良做法
我正在尝试在列表理解期间更改数组,但由于某种原因它会挂起,我不知道为什么或如何解决这个问题。
我正在处理一系列不确定深度的列表,需要将它们压缩到一个平面列表 - for those curious its this question。但是在这个阶段,我只想说我需要列表中所有元素的平面列表,如果它是列表则需要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
循环工作正常?
编辑:为了防止此问题被删除,我不是在寻找高尔夫球技巧(尽管他们非常有教育意义),我一直在寻找答案,为什么代码不是像我写的那样工作。
答案 0 :(得分:8)
or
可能是懒惰的,但列表定义则不是。对于o
中的每个x
,当评估[o,x.append(o) or 0][type(o)==type([])]
怪物时,Python必须评估[o,x.append(o) or 0]
,这意味着评估x.append(o) or 0
,这意味着{{1}无论是否为列表,都会附加到o
。因此,您最终将x
的每个元素附加到x
,然后一次又一次地追加并x
答案 1 :(得分:3)
怎么样:
y = [element for element in x if type(element) != list or x.extend(element)]
(请注意,extend
会变平,而append
只会将嵌套列表添加回最终版本,而不会被展开。