如何在列表理解或评估中使用多行语句?
我试图转换这段代码:
def f(x, y, b=''):
for i in x:
if i in y:
y.remove(i)
i *= 2
b += i
return b
像这样进入 lambda 函数:
j=lambda x,y:''.join(eval('y.remove(i);i*2')if i in y else i for i in x)
在 x
中都是一个字符串,例如 'onomatopoeia'
而 y
是一个列表,例如 ['o', 'a','o']
.
但由于某种原因,它返回一个语法错误。谁能解释一下?
最佳答案
首先,由于循环中的副作用,您可能不应该使用 lambda 重写它。如果您真的想要,请不要使用 eval。
我建议:
j = lambda x, y: ''.join((y.remove(i) or 2 * i) if i in y else i for i in x)
因为 remove 的结果是 None
,or
的第二个参数将是结果。这避免了评估。但它仍然比 for 循环更糟糕。
如对原始问题的评论所述,2 * y.pop(y.index(i))
比 or
结构更具可读性。您将在 y
上循环两次,但性能似乎不是问题。
关于Python 2 列表理解和评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30986215/