[英]Using if, elif, else in List Comprehensions, Python
我在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列表理解而不是最终的其他?
你是(ab)使用条件表达式 , true_expression if test else false_expression
,它们必须是true_expression if test else false_expression
形式。 与if
复合语句不同,这些表达式始终生成一个值。
请注意,你不应该测试== True
; 没有该测试,布尔表达式已经为true或false。 不要使用<>
,该运算符已被弃用并已从Python 3中删除。 当测试None
,单例时,你使用is not None
。
您正在测试type()
结果; 看起来你想要使用isinstance()
测试 。
您还在值上使用int()
,然后在结果上调用.lower()
。 没有int.lower()
方法,因此这些调用将因AttributeError
而失败。
除非有比int
, float
, str
或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]
如果您创建辅助功能来帮助您可能会更容易。 我还删除了== True
和int().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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.