在List Comprehensions中使用if,elif,else,Python

时间:2013-10-18 22:03:34

标签: python if-statement list-comprehension

我在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'来关闭一系列条件句。在我看来,我的代码想要理解中的最终“其他”。我是否正确陈述,如果是这样,有没有办法构建一个最终的其他,如果在python列表理解而不是最终的其他?

2 个答案:

答案 0 :(得分:9)

您(ab)正在使用conditional expressions,而必须的格式为true_expression if test else false_expression。与if复合语句不同,这些表达式总是生成一个值。

请注意,您应该测试== True;没有该测试,布尔表达式已经为true或false。不要使用<>,该运算符已被弃用且已从Python 3中删除。在测试单None时,您会使用is not None

您正在测试type()结果;看起来您想要使用isinstance() tests

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

除非有intfloatstrunicode以外的类型,否则以下内容更接近正常工作:

[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]

答案 1 :(得分: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]