首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python 2.7 lambda的几个条件?埃利夫?

Python 2.7 lambda的几个条件?埃利夫?
EN

Stack Overflow用户
提问于 2018-04-15 01:10:33
回答 3查看 288关注 0票数 -1

在我遵循的指南中,我遇到了一个错误:CoreMD using Python

需要按照指南创建一个简单的数据集。guide之间的唯一区别是由我决定的:

代码语言:javascript
复制
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")

而不是:

代码语言:javascript
复制
data["foodType"] = data["path"].apply(lambda path: "Rice" if "rice"

终端中的错误日志:

python classifier.py

回溯(最近一次调用):文件"classifier.py",第20行,在data.save中(“ptype.sframe”)

文件格式行2808,在save raise ValueError中(“不支持的格式:{}”.format( "/usr/local/lib/python2.7/site-packages/turicreate/data_structures/sframe.py",))

File "/usr/local/lib/python2.7/site-packages/turicreate/cython/context.py",第49行,在exit raise exc_type(exc_value)中

RuntimeError: python回调函数求值异常:

TypeError(“无法将类型‘函数’转换为灵活类型。”,):

回溯(最近一次调用):在turicreate.cython.cy_pylambda_workers.lambda_evaluator.eval_simple中的turicreate.cython.cy_pylambda_workers._eval_lambda文件"turicreate/cython/cy_pylambda_workers.pyx",第172行中,文件“turicreate/cython/ call _workers.pyx”,第427行。

文件“turicreate/cython/cy_type.pyx”,行1306,位于turicreate.cython.cy_flexible_type.process_common_typed_list文件“turicreate/cython/cy_type.pyx”,行1251,位于turicreate.cython.cy_flexible_type._fill_typed_sequence文件“turicreate/cython/cy_type.pyx”,行1636,位于turicreate.cython.cy_flexible_type._ft_translate

TypeError:无法将类型“function”转换为灵活类型。

问题可能是什么,因为我不能用Python2.7运行我的classifier.py

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-16 16:00:19

用一个简单的函数替换嵌套的if / else结构。

下面是一个示例:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-04-16 06:24:24

语法不正确:

代码语言:javascript
复制
     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"

正确的语法:

代码语言:javascript
复制
    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")))))))))))))))
票数 1
EN

Stack Overflow用户

发布于 2018-05-19 04:54:46

这里的问题是,如果第一次求值为真,您的函数将返回一个字符串,否则将返回一个lambda函数,因为它不会调用此函数。因此会抛出类型错误,因为SFrame列不能保存不同的类型(字符串或函数)。我强烈建议您定义一个长if else函数,并将其传递给apply或一个类似的、更高效的函数。

为了简化和使用Turicreate对jpp的代码进行了修改

代码语言:javascript
复制
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      |
#+---------+-----------------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49834062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档