python - 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
请让我知道这是否已经得到解答或是否需要更多信息。:)
解决方案
不要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
更正的电话要简单得多。
推荐阅读
- c - 传入 char* 中的字节间隔
- python - 在 gRPC 消息字段中使用 Any 类型的正确方法是什么?
- python - 在 python 中,使用套接字编程如何显示在客户端接收到的数据?
- c# - 从 C# 隐藏 SVG 元素
- c# - DelegateMethod 改进对对象集的反射
- ruby-on-rails - 自定义 Rails 投票系统路由不起作用
- python - 在远程主机上监听 rabbitmq 队列
- angular - 在 mat-table 中添加列而不影响 previos 列数据
- angular - (ngx-admin/Nebular) 如何删除我的自定义登录组件上的后退按钮?
- javascript - 移动到 d3 v5 后,颜色后代节点和链接断开