Python:列表理解中的 return 语句

Beg*_*man 0 python return list-comprehension

是否可以将 return 语句放入列表理解中?

[foo.remove(i) for i in bar]
return ''.join(foo) 
Run Code Online (Sandbox Code Playgroud)

我的猜测是否定的,因为 return 语句之后的代码没有执行。

aba*_*ert 5

return是一个声明。

\n\n

列表推导式不能包含语句,只能包含表达式。

\n\n

事实上,这对所有人来说都是如此:它们只能包含其他表达式。

\n\n

所以,不,你不能将 a 放入return列表理解中。

\n\n

如果您确实需要foo就地进行变异,那么您尝试做的事情最好写成一个for语句(作为一个复合语句,当然可以包含其他语句):

\n\n
for i in bar: foo.remove(i)\nreturn \'\'.join(foo)\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然推导式比构建列表的语句更快for但这主要是因为它们可以使用专门优化的list.append. 如果您实际上并不想要生成的列表,那么它们会更,因为即使非常快,list.append仍然比根本不构建列表慢很多。

\n\n

而且,更重要的是,仅仅为了副作用而使用推导式不仅效率低下,而且还使您的代码不那么惯用,并且更难以理解。

\n\n

无论如何,如果您确实需要优化此代码,您可能不应该foo就地进行更改。每次调用 时foo.remove(i),都需要线性工作来查找第一次出现的位置i,然后将列表的其余部分向上移动。因此,如果bar的大小与 大致相同foo,则需要进行二次工作。但您可以复制列表,并在线性时间内进行过滤:

\n\n
barset = set(bar)\nreturn \'\'.join([x for x in foo if x not in barset])\n
Run Code Online (Sandbox Code Playgroud)\n\n

(我假设这里你没有任何重复的值,并且foo\ barxe2\x80\x94 如果有的话,我愿意打赌remove实际上并没有做你想做的事情。但是,如果是这样,你确实需要一些更复杂的东西。)

\n