Lambda和eval在函数中不起作用

2024-05-20 21:38:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python的新手,非常感谢您对我下面的问题的帮助

问题:

我正在一个数据帧上进行关键字匹配,我在Jupyter笔记本中尝试了这个代码,它工作得非常好。但是,相同的代码在可视代码中不起作用。Jupyter Notebook和VS代码都运行在相同的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中收到了预期的输出,但是,可视化代码声明了以下错误

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

请告诉我是否已经回答了这个问题,或者是否需要进一步的信息:


Tags: 数据lambda代码infalsetruedfhave
1条回答
网友
1楼 · 发布于 2024-05-20 21:38:14

不要在这里使用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查找要比调用evalcorrect简单得多

相关问题 更多 >