2

我在 python 中创建了以下列表理解:

[int(a[0].internal_value).lower() if type(a[0].internal_value) in (str,unicode) and a[0].internal_value.isdigit() == True
 else str(a[0].internal_value).lower() if type(a[0].internal_value) in (str,unicode)
 else int(a[0].internal_value) if type(a[0].internal_value) in (float,int)
 for a in ws.iter_rows() if a[0].internal_value <> None]

我在尝试构建最终的 else 时遇到问题,如果条件:

else int(a[0].internal_value) if type(a[0].internal_value) in (float,int)

如果我在该行中使用 if 条件,我会得到一个无效的语法。

 if type(a[0].internal_value) in (float,int)

如果我删除 if 语句

else int(a[0].internal_value)

然后它似乎运行良好。我需要在那里有那个 if 语句。

对我来说,如果条件是执行更简单的 if, else 条件的列表推导方式:

if i == x:
  do something
elif i == y:
  do something
elif i == z:
  do something

按照规则,您不必总是用“else”来结束一系列条件句。在我看来,我的代码在理解中需要一个最终的“else”。我是否正确地说明了这一点,如果是这样,有没有办法构造一个最终的 else,如果在 python 列表理解而不是最终的 else 中?

4

2 回答 2

10

您正在(ab)使用条件表达式,它们必须是形式true_expression if test else false_expression。与复合语句不同,这些表达式总是产生一个值。if

请注意,您不应该测试== True; 没有那个测试,布尔表达式已经是真或假。也不要使用<>,该运算符已被弃用,并已从 Python 3 中完全删除。但是,在测试None单例时,您会使用is not None

您正在根据结果进行测试type();看起来您想改用isinstance()测试

您还使用int()on 值,然后调用.lower()结果。没有int.lower()方法,因此这些调用将失败并带有AttributeError.

以下更接近正常工作,除非类型多于int, float, stror unicode

[int(a[0].internal_value) if isinstance(a[0].internal_value, (float, int)) or a[0].internal_value.isdigit() 
 else str(a[0].internal_value).lower()
 for a in ws.iter_rows() if a[0].internal_value is not None]

但是,我将转换为过滤器功能:

def conversion(value):
    if isinstance(value, (float, int)):
        return int(value)
    return str(value).lower()

然后在列表理解中使用它:

[conversion(a[0].internal_value) for a in ws.iter_rows() if a[0].internal_value is not None]
于 2013-10-18T22:07:23.257 回答
2

如果您创建一个辅助功能来帮助您,可能会更容易。我也删除了== Trueint().lower()。我认为将所有逻辑都塞进列表理解中没有任何好处,但这取决于你。

def helper(x):
    if type(x) in (str,unicode) and x.isdigit():
        return int(x)
    elif type(x) in (str,unicode):
        return str(x).lower()
    elif type(x) in (float,int):
        return int(x)

[helper(a[0].internal_value)
 for a in ws.iter_rows()
 if a[0].internal_value <> None]
于 2013-10-18T22:17:18.103 回答