这里通常的解决方案是不要完全沉迷于使用列表理解的想法。只需使用一个for
loop:
yay, nay = [], []
for i in a:
if somecondition(i):
yay.append(i)
else:
nay.append(i)
如果您发现自己经常这样做,那么只需将代码移到一个函数中即可:
def yesno(seq, cond):
yay, nay = [], []
for i in seq:
if cond(i):
yay.append(i)
else:
nay.append(i)
return yay, nay
yay, nay = yesno(a, lambda x: a[x])
评论表明这比列表理解慢。将条件作为 lambda 传递不可避免地会产生很大的影响,我认为您对此无能为力,但一些性能影响可能来自于查找append
方法及可改进之处:
def yesno(seq, cond):
yay, nay = [], []
yes, no = yay.append, nay.append
for i in seq:
if cond(i):
yes(i)
else:
no(i)
return yay, nay
我不知道这是否会产生很大的影响,但计时可能会很有趣。
在评论中 @martineau 建议使用生成器并使用它any()
。我将把它放在这里,但我会替换any
使用 itertools 配方来使用迭代器:
def consume(iterator, n):
"Advance the iterator n-steps ahead. If n is none, consume entirely."
# Use functions that consume iterators at C speed.
if n is None:
# feed the entire iterator into a zero-length deque
collections.deque(iterator, maxlen=0)
else:
# advance to the empty slice starting at position n
next(islice(iterator, n, n), None)
然后你可以写:
yay, nay = [], []
consume((yay if a[i] else nay).append(i) for i in a)