[英]if else in list comprehension with for loop
我已经为展平列表编写了自己的简单解决方案:
lists = [0, 10, [20, 30], 40, 50, [60, 70, 80], [90, 100, 110, 120]]
new = []
for item in lists:
if str(item).isdigit() != True:
for v in item:
new.append(v)
else:
new.append(item)
print(new)
但是我想在下面的代码中添加一个else
/ elif
来缩短代码:
new = [v for item in lists if str(item).isdigit() != True for v in item]
我不知道如何宁愿得到语法错误。
试试这个:
>>> [v for item in lists for v in (item if isinstance(item, list) else [item])]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
这有点低效,因为它将 integer 包装到一个列表中,然后对其进行迭代,但对于大多数用途来说这无关紧要。 尽量不要使用字符串表示来检查数据类型,因为您可能会得到意想不到的结果(例如,尝试使用浮点数而不是列表中的 integer 运行原始代码)。
首先是原始代码的一些注释:
代替
if str(item).isdigit():= True:
使用更多 Pythonic
if not str(item).isdigit():
与其采用相同的、投机的方式来达到你的目标,不如使用更清晰的方式
if type(item) is not list:
现在,关于列表理解中的else
。 它可能只在它的第一部分,列表理解的语法不允许它在for
子句之后(在if
过滤表达式中)。
因此,您需要将列表理解的第二for
的可迭代更改为始终可迭代,即例如item
[20, 30]
没问题(因为它是可迭代的)10
它不行(因为它不是可迭代的) - 所以让我们用括号括起来 - [10]
所以我们将根据type(item)
在item
和[item]
之间切换:
item if type(item) is list else [item]
(它是一个条件表达式,而不是一个列表理解,所以在这里else
是可以的。)
所以完整的解决方案可能是
new = [v for item in lists
for v in (item if type(item) is list else [item])]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.