首页 > 解决方案 > Lambda 和 eval 在函数内部不起作用

问题描述

我是 python 的新手,非常感谢您在我的以下问题中提供的帮助。

问题:

我正在对 Dataframe 进行关键字匹配,我确实尝试了 Jupyter notebook 中的代码,它运行良好。但是,相同的代码在 Visual Code 中不起作用。Jupyter Notebook 和 VS Code 都在同一个 python 环境中运行。

输入数据框:

note
-----------------
I have a kayak
I have a jet-ski
I have a canoe
I have a jetski

神奇的代码:

def extract():
    keywords = ['kayak','jetski']

    kayak = re.compile(r'.*(pin.pad|pinpad).*')
    jetski= re.compile(r'.*(jetski|jet.ski).*')

    for i in keywords:
        df[i] = df['note'].apply(lambda x: bool(eval((i)).match(x)))

我确实在 Jupyter 中收到了预期的输出,但是 Visual Code 指出了以下错误。

File "xyz.py", line 8, in <lambda>
    df[i] = df['note'].apply(lambda x: bool(eval((i)).match(x)))
  File "<string>", line 1, in <module>
NameError: name 'kayak' is not defined

预期输出:

note                  kayak       jetski
-----------------------------------------
I have a kayak         True        False
I have a jet-ski       False       True
I have a canoe         False       False
I have a jetski        False       True

请让我知道这是否已经得到解答或是否需要更多信息。:)

标签: pythonlambdaeval

解决方案


不要eval在这里使用。只需定义一个dict将“kayak”和“jets”映射到适当的对象。

def extract():
    keywords = {
       'kayak': re.compile(r'.*(pin.pad|pinpad).*'),
       'jetski': re.compile(r'.*(jetski|jet.ski).*')
    }

    for keyword, regex in keywords.items():
        df[keyword] = df['note'].apply(lambda x: bool(regex.match(x)))

问题是您的两个变量在 lambda 表达式创建的函数的本地范围内不存在,但它们也不在全局范围内。一个普通的dict查找比接到一个eval更正的电话要简单得多。


推荐阅读