在列表理解中使用if、elif、else、Python

在列表理解中使用if、elif、else、Python,python,if-statement,list-comprehension,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_va

我用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]
如果在该行中使用if条件,则得到的语法无效

 if type(a[0].internal_value) in (float,int)
如果我删除If语句

else int(a[0].internal_value)
然后它似乎运行良好。我需要在里面有if语句

对我来说,如果条件是列表理解,那么更简单的如果条件是:

if i == x:
  do something
elif i == y:
  do something
elif i == z:
  do something
根据规则,你不必总是用“else”来结束一系列条件句。在我看来,我的代码需要理解中的最后一个“else”。我说的对吗?如果是,有没有办法构造一个final-else,如果是在python列表理解中而不是final-else?

您正在(ab)使用,并且它们的形式必须是
true\u表达式if-test-else-false\u表达式
。这些表达式总是生成一个值,这与
if
复合语句不同

请注意,您不应该测试
==True
;没有该测试,布尔表达式已经是true或false。也不要使用
,该操作符已被弃用,并已从Python3中完全删除。当测试
None
时,您会使用
而不是None

您正在测试
type()
结果;看起来你想用它来代替

您还在值上使用
int()
,然后在结果上调用
.lower()
。没有
int.lower()

除非有比
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]
但是,我会将转换分包到filter函数:

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]
def助手(x):
如果在(str,unicode)和x.isdigit()中键入(x):
返回整数(x)
(str,unicode)中的elif类型(x):
返回str(x).lower()
elif类型(x)输入(浮点,整数):
返回整数(x)
[helper(a[0]。内部值)
对于ws.iter_行()中的
如果为[0]。内部\u值无]

注意:
已被弃用,取而代之的是
=;不推荐使用的运算符已从Python 3中完全删除。@Martijn。我正在跑步。7@Joran比斯利。您需要从列表理解的某个地方开始。@迈克,开始是
[x*x代表范围(10)]
,而不是这个。听Joran说……是的(我还是给了你+1),因为如果你真的出于某种原因想做这样的列表理解,这是一个很好的解释:P@Martijn. 谢谢你花时间帮我解决这个问题。我正在使用你的代码并做一些测试。我会回来告诉你我的结果。谢谢@马蒂恩。谢谢你,真管用!我可能还有一些类型需要编写脚本,但我认为我可以在函数中处理这些类型,并调用列表。非常清晰简洁的回答@阿克斯布朗特。谢谢你!绝对解决了我的问题,并帮助我理解何时正确使用列表理解。我现在正处于学习曲线上:)
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]