是否可以在列表解析中添加return语句?
[foo.remove(i) for i in bar]
return ''.join(foo)
我的猜测是否定的,因为没有执行return语句之后的代码。
答案 0 :(得分:1)
return
是一个声明。
List comprehensions不能包含语句,只能包含表达式。
事实上,对于Python中的所有表达式都是如此:它们只能包含其他表达式。
所以,不,你不能在列表理解中加入return
。
如果你确实需要就地foo
进行变异,那么你要做的事情就更好地写成for
声明(作为复合声明,当然可以包含其他陈述):
for i in bar: foo.remove(i)
return ''.join(foo)
虽然理解 比构建列表的for
语句更快,但这主要是因为他们可以使用list.append
的特别优化版本。如果您实际上想要结果列表,那么他们会慢 ,因为即使是非常快的list.append
仍然比根本没有建立清单。
更重要的是,仅仅为了副作用使用理解并不是效率低下,它会使你的代码不那么惯用,而且难以理解。
无论如何,如果你真的需要优化这段代码,你可能不应该在原地改变foo
。每次调用foo.remove(i)
时,都需要线性工作才能找到i
的第一个匹配项,然后将列表的其余部分移位。因此,如果bar
的大小与foo
大致相同,则需要进行二次工作。但你可以在线性时间内复制列表,按照过程进行过滤:
barset = set(bar)
return ''.join([x for x in foo if x not in barset])
(我假设您在foo
和bar
中没有任何重复值 - 如果您这样做,我愿意打赌{{1实际上并没有做你想做的事情。但是,如果是这样,你确实需要一些更复杂的东西。)