Python 2.7 lambda 的几个条件?埃利夫?
Posted
技术标签:
【中文标题】Python 2.7 lambda 的几个条件?埃利夫?【英文标题】:Python 2.7 several conditions for lambda? Elif? 【发布时间】:2018-09-24 19:42:04 【问题描述】:在我遵循的指南中出现错误:CoreMD using Python
需要按照指南创建一个简单的数据集。指南之间的唯一区别是我做的:
data["personalityType"] = data["path"].apply( lambda path: "Enfj" if "enfj" in path
else lambda path: "Enfp" if "enfp" in path
else lambda path: "Entj" if "entj" in path
else lambda path: "Entp" if "entp" in path
else lambda path: "Esfj" if "esfj" in path
else lambda path: "Esfp" if "esfp" in path
else lambda path: "Estj" if "estj" in path
else lambda path: "Estp" if "estp" in path
else lambda path: "Infj" if "Infj" in path
else lambda path: "Infp" if "infp" in path
else lambda path: "Intj" if "intj" in path
else lambda path: "Intp" if "intp" in path
else lambda path: "Isfj" if "isfj" in path
else lambda path: "Isfp" if "isfp" in path
else lambda path: "Istj" if "istj" in path
else "Istp")
代替:
data["foodType"] = data["path"].apply(lambda path: "Rice" if "rice"
终端中的错误日志:
python 分类器.py
Traceback(最近一次调用最后一次):文件“classifier.py”,第 20 行,在 data.save("ptype.sframe")
文件 “/usr/local/lib/python2.7/site-packages/turicreate/data_structures/sframe.py”, 第 2808 行,保存中 raise ValueError("不支持的格式:".format(format))
文件 “/usr/local/lib/python2.7/site-packages/turicreate/cython/context.py”, 第 49 行,在 退出 提高 exc_type(exc_value)
RuntimeError:python 回调函数评估中的异常:
TypeError("无法将类型'function'转换为灵活类型。",):
Traceback(最近一次调用最后一次):文件 “turicreate/cython/cy_pylambda_workers.pyx”,第 427 行,在 turicreate.cython.cy_pylambda_workers._eval_lambda 文件 “turicreate/cython/cy_pylambda_workers.pyx”,第 172 行,在 turicreate.cython.cy_pylambda_workers.lambda_evaluator.eval_simple 文件“turicreate/cython/cy_flexible_type.pyx”,第 1306 行,在 turicreate.cython.cy_flexible_type.process_common_typed_list 文件 “turicreate/cython/cy_flexible_type.pyx”,第 1251 行,在 turicreate.cython.cy_flexible_type._fill_typed_sequence 文件 “turicreate/cython/cy_flexible_type.pyx”,第 1636 行,在 turicreate.cython.cy_flexible_type._ft_translate
TypeError: 无法将类型“函数”转换为灵活类型。
问题可能是什么,因为我无法使用 Python 2.7 运行我的 classifier.py
【问题讨论】:
肯定是 Lambda 的原因,但我不知道如何解决 10+ 个品种 如果你传递一个常规函数而不是一大堆嵌套的 lambda,它会起作用吗? 不是 xD 尝试使用 elif 你会考虑一个简单的函数来代替嵌套的if
/else
吗?
@jpp 我对 python 语法不太熟悉 :(
【参考方案1】:
语法错误:
lambda path: "Enfj" if "enfj" in path
else lambda path: "Enfp" if "enfp" in path
else lambda path: "Entj" if "entj" in path
else lambda path: "Entp" if "entp" in path
else lambda path: "Esfj" if "esfj" in path
else lambda path: "Esfp" if "esfp" in path
else lambda path: "Estj" if "estj" in path
else lambda path: "Estp" if "estp" in path
else lambda path: "Infj" if "Infj" in path
else lambda path: "Infp" if "infp" in path
else lambda path: "Intj" if "intj" in path
else lambda path: "Intp" if "intp" in path
else lambda path: "Isfj" if "isfj" in path
else lambda path: "Isfp" if "isfp" in path
else lambda path: "Istj" if "istj" in path
else "Istp"
正确的语法:
lambda path: "Enfj" if "enfj" in path
else("Enfp" if "enfp" in path
else("Entj" if "entj" in path
else("Entp" if "entp" in path
else("Esfj" if "esfj" in path
else("Esfp" if "esfp" in path
else("Estj" if "estj" in path
else("Estp" if "estp" in path
else("Infj" if "Infj" in path
else("Infp" if "infp" in path
else("Intj" if "intj" in path
else("Intp" if "intp" in path
else("Isfj" if "isfj" in path
else("Isfp" if "isfp" in path
else("Istj" if "istj" in path
else "Istp")))))))))))))))
【讨论】:
【参考方案2】:用一个简单的函数替换嵌套的if
/ else
构造。
下面是一个例子:
import pandas as pd, numpy as np
df = pd.DataFrame('A': ['enfpD', 'iNfp', 'sadintj', 'abc'])
choices = 'enfp', 'entj' , 'entp', 'esfj' , 'esfp',
'estj', 'estp', 'infj', 'infp', 'intj',
'intp', 'isfj', 'isfp', 'istj'
def changer(x):
match = next((c for c in choices if c in x), None)
if match:
return match.title()
else:
return 'Istp'
df['A'] = df['A'].apply(changer)
print(df)
# A
# 0 Enfp
# 1 Istp
# 2 Intj
# 3 Istp
【讨论】:
我放弃了。最后,我有一个 104 if else 语句的问题,这是唯一的解决方案 :) 谢谢!但是,您能否帮助解决另一个类似的示例,因为我看不到选择(16 个路径/名称...得到这个。)和 DataFrame...只有 4 个之间的联系?变量是什么意思? ***.com/questions/51182760/…【参考方案3】:这里的问题是,如果第一次评估为真,您的函数会返回一个字符串,否则它会返回一个 lambda 函数,因为它不会调用此函数。因此,由于 SFrame 列不能容纳不同的类型(字符串或函数),因此会引发类型错误。我强烈建议定义一个 long if else 函数并将其传递给 apply 或类似的更高效的函数。
为了简单和使用 Turicreate 修改了 jpp 的代码
import turicreate as tc
sf = tc.SFrame('path': ['enfpD', 'iNfp', 'sadintj', 'abc'])
choices = ['enfp', 'entj' , 'entp', 'esfj' , 'esfp',
'estj', 'estp', 'infj', 'infp', 'intj',
'intp', 'isfj', 'isfp', 'istj']
def changer(x):
for choice in choices:
if choice in x:
return choice.capitalize()
return 'Istp'
sf['personalityType'] = sf['path'].apply(changer)
print(sf)
#+---------+-----------------+
#| path | personalityType |
#+---------+-----------------+
#| enfpD | Enfp |
#| iNfp | istp |
#| sadintj | Intj |
#| abc | Istp |
#+---------+-----------------+
【讨论】:
我同意你的观点,但我刚刚开始学习 Python,你能帮我在我的一个类似例子中说明清楚吗?现在我有更多的样本,这是 if/else 语句的问题))***.com/questions/51182760/… @Oleksandr 即使您使用的是 TuriCreate 而不是 Pandas,应用程序中的代码仍然可以工作。 你能举个例子吗? @Oleksandr 我将 jpp 的代码修改为更简单并使用 turicreate。 在哪里?因为我找到了您的类似主题: x for x in list if x.split in output.split() 但如果创建包含所有项目的列表,我只有错误:list=[„ars1”,”ars2 ”,...]以上是关于Python 2.7 lambda 的几个条件?埃利夫?的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Python 2.7 Lambda:DPI-1047:无法加载 64 位 Oracle 客户端库:“libclntsh.so”