在列表理解中使用if、elif、else、Python
我用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
[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]