Python 2.7 lambda的几种条件?伊利夫?

Python 2.7 several conditions for lambda? Elif?

在我遵循的指南中出现错误: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 classifier.py

Traceback (most recent call last): File "classifier.py", line 20, in data.save("ptype.sframe")

File "/usr/local/lib/python2.7/site-packages/turicreate/data_structures/sframe.py", line 2808, in save raise ValueError("Unsupported format: {}".format(format))

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

RuntimeError: Exception in python callback function evaluation:

TypeError("Cannot convert type 'function' into flexible type.",):

Traceback (most recent call last): File "turicreate/cython/cy_pylambda_workers.pyx", line 427, in turicreate.cython.cy_pylambda_workers._eval_lambda File "turicreate/cython/cy_pylambda_workers.pyx", line 172, in turicreate.cython.cy_pylambda_workers.lambda_evaluator.eval_simple
File "turicreate/cython/cy_flexible_type.pyx", line 1306, in turicreate.cython.cy_flexible_type.process_common_typed_list File "turicreate/cython/cy_flexible_type.pyx", line 1251, in turicreate.cython.cy_flexible_type._fill_typed_sequence File "turicreate/cython/cy_flexible_type.pyx", line 1636, in turicreate.cython.cy_flexible_type._ft_translate

TypeError: Cannot convert type 'function' into flexible type.

可能是什么问题,因为我不能 运行 我的 classifier.py 和 Python 2.7

语法错误:

     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")))))))))))))))

用一个简单的函数替换嵌套的 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

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

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

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      |
#+---------+-----------------+