Python 使用for循环理解列表中的if-else

Python 使用for循环理解列表中的if-else,python,python-3.x,list,Python,Python 3.x,List,我已经为扁平化列表编写了自己的简单解决方案: 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)

我已经为扁平化列表编写了自己的简单解决方案:

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]

这有点低效,因为它将一个整数包装到一个列表中,然后对其进行迭代,但对于大多数目的来说,这并不重要。尽量不要使用字符串表示法来检查数据类型,因为可能会导致意外的结果(例如,尝试使用浮点数而不是列表中的整数来运行原始代码)。

首先请注意原始代码的一些注意事项:

  • 而不是

    if str(item).isdigit() != True:
    
    多用蟒蛇

    if not str(item).isdigit():
    
  • 不要使用相同的、推测性的方法来实现目标,而是使用更清晰的方法

    if type(item) is not list:
    
  • 现在,关于列表理解中的else。它可能只在它的第一部分,列表理解的语法不允许它在
    for
    子句之后(在
    if
    过滤表达式中)

    因此,您需要将列表理解的第二个
    中的iterable更改为始终是iterable,例如

    • [20,30]
      没问题(因为它是一个可编辑的)
    • 10
      它不正常(因为它不是一个iterable)-所以让我们用括号括起来-
      [10]
    因此,我们将根据
    类型(项目)
    项目
    [项目]
    之间切换:

    (这是一个条件表达式,而不是列表理解,因此这里可以使用
    else
    。)

    因此,完整的解决方案可能是

    new = [v for item in lists 
             for v in (item if type(item) is list else [item])]
    

    为了完整起见,我要提到:
    collections.abc.Iterable
    @Aaron老实说,这感觉工作量太大了,因为它也不可靠。调用
    iter
    并捕获异常是一种方法,但这会使本例复杂化,并忽略要点。根据您的解决方案,我找到了我的新解决方案哈哈。。谢谢你,伙计:)
    new=[v代表列表中的项目,v代表列表中的项目(item if str(item).isdigit()!=True else[item])
    。谢谢你的帮助,伙计!
    new = [v for item in lists 
             for v in (item if type(item) is list else [item])]