编辑
哦,好吧,我写了一个与 Duncan 的一个非常相似的解决方案。所以我删除了我写的东西,我让我认为是最好的解决方案,将一个 Duncan 的解决方案和 martineau 的建议混合在一起(在我看来,使用any()比使用list()或列表更可取)像我写的那样理解; any()是个好主意,这比导入consume() IMO 的复杂性要好)
def disting(L):
dust,right = [],[]
dustapp = dust.append
rightapp = right.append
any(rightapp(x) if x else dustapp(x) for x in L)
return right,dust
for seq in ((10,None,'a',0,None,45,'qada',False,True,0,456),
[False,0,None,104,True,str,'',88,'AA',__name__]):
yay,nay = disting(seq)
print 'seq == %r\nyay == %r\nnay == %r' % (seq,yay,nay)
print '---------------------------------------'
结果
seq == (10, None, 'a', 0, None, 45, 'qada', False, True, 0, 456)
yay == [10, 'a', 45, 'qada', True, 456]
nay == [None, 0, None, False, 0]
---------------------------------------
seq == [False, 0, None, 104, True, <type 'str'>, '', 88, 'AA', '__main__']
yay == [104, True, <type 'str'>, 88, 'AA', '__main__']
nay == [False, 0, None, '']
---------------------------------------
顺便说一句,使用any()是有效的,因为rightapp(x)
并dustapp(x)
返回 None。如果返回 True 或等价于 True,则any()内的迭代将停止!