繁体   English   中英

if else 在列表理解中使用 for 循环

[英]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 运行原始代码)。

首先是原始代码的一些注释:

  1. 代替

    if str(item).isdigit():= True:

    使用更多 Pythonic

     if not str(item).isdigit():
  2. 与其采用相同的、投机的方式来达到你的目标,不如使用更清晰的方式

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM