python列表理解的不正当行为

时间:2017-03-10 23:22:50

标签: python-2.7 list-comprehension

我找到了thisthis,但就我所知,我相信我并没有重复这些问题。

虽然修补编写最短的代码 可以编写以查找集合的powerset,但我遇到了这种行为:

lst = [1,2,3]
powerset = set([()])

[powerset.update([subset + tuple([x]) for subset in powerset]) for x in lst]

print 'powerset:', sorted(powerset, key = lambda x: len(x))

> powerset: [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

令我更进一步的是,即使列表理解产生的列表完全不同,也会更新powerset。

lst = [1,2,3]
powerset = set([()])
holy_ghost = [powerset.update([subset + tuple([x]) for subset in powerset]) for x in lst]

print 'holy_ghost:', holy_ghost
print 'powerset:',sorted(powerset, key = lambda x: len(x))
print type(powerset),', len:', len(powerset)

> holy_ghost: [None, None, None]
> powerset: [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
> <type 'set'> , len: 8

这是列表推导的嵌套循环版本,需要一个&#34; dummy&#34;变量以避免"Set changed size during iteration"运行时错误。

lst2 = [1,2,3]
powerset2 = set([()])
for x in lst2:
    dummy = set(powerset2)
    for subset in powerset2:
        dummy.update([subset + tuple([x])])
    powerset2 = dummy
print sorted(powerset2, key = lambda x: len(x)) 

[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

问题:在python 2.7中,这是否可以安全使用列表理解样式代码?

我不是程序员,所以如果你把它放在我的水平(初学者+ /中级 - )我会很感激:)

感谢。

0 个答案:

没有答案