在列表理解期间使用append更改列表

时间:2013-12-11 00:22:13

标签: python list-comprehension

警告:这是代码打高尔夫球的一个直接问题,所以我知道我要问的是制作中的不良做法

我正在尝试在列表理解期间更改数组,但由于某种原因它会挂起,我不知道为什么或如何解决这个问题。

我正在处理一系列不确定深度的列表,需要将它们压缩到一个平面列表 - 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循环工作正常?

编辑:为了防止此问题被删除,我不是在寻找高尔夫球技巧(尽管他们非常有教育意义),我一直在寻找答案,为什么代码不是像我写的那样工作。

2 个答案:

答案 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只会将嵌套列表添加回最终版本,而不会被展开。

相关问题