Python 2 列表理解和评估

标签 python lambda eval list-comprehension

如何在列表理解或评估中使用多行语句?

我试图转换这段代码:

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 的结果是 Noneor 的第二个参数将是结果。这避免了评估。但它仍然比 for 循环更糟糕。


如对原始问题的评论所述,2 * y.pop(y.index(i))or 结构更具可读性。您将在 y 上循环两次,但性能似乎不是问题。

关于Python 2 列表理解和评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30986215/

相关文章:

python - python中的Lua解析器

javascript - 在不使用 eval 的情况下通过键路径从嵌套的 JSON 字典中获取值

python - 从 .txt 文件中获取行并复制到 word .doc

Java 8 如何在没有 Lambda 的情况下编写函数?

Java 8 : grouping by multiple fields and then sort based on value

c# - 如何创建比较子对象中属性的表达式树?

python - 使用 python 中的列表查找和替换 csv 字符串

python - Selenium:删除 cookie 时出现问题

python - 在 NLTK 中导入 WordNet

javascript - (1, eval) ('this' ) vs eval ('this' ) 在 JavaScript 中?