编写一个列表理解来扁平嵌套的lis

2024-04-23 11:55:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个混合了列表和数字的嵌套列表。在

nested = [[1, 2, 3], [4, 5, 6], [7, 8], [9], 10, 11]

嵌套列表只包含数字,不会包含更多列表。在

是否可以编写一个列表理解来从“嵌套”列表中生成新列表,并生成以下输出?在

^{pr2}$

这是我的尝试(代码不起作用)

[num if isinstance(item, list) for num in item else item for item in nested]

Tags: 代码in列表forif数字itemelse
2条回答

您需要将实例测试放入循环中,以便从嵌套列表中提取元素:

[num for item in nested for num in (item if isinstance(item, list) else (item,))]

演示:

^{pr2}$

如果您首先将其表示为一组for循环,则会有所帮助;您的尝试实际上是这样做的:

for item in nested:
    _element = num if isinstance(item, list) for num in item else item
    result.append(_element)

这不是真正有效的Python。在

我在上面列出的理解反而是这样做的:

for item in nested:
    _iterable = item if isinstance(item, list) else (item,)
    for num in _iterable:
        _element = num
        result.append(_element)

如果列表具有任意嵌套,最好使用递归函数(referring to one of my other answers):

>>> def flat_gen(x):
...     def iselement(e):
...         return not(isinstance(e, collections.Iterable) and not isinstance(e, str))
...     for el in x:
...         if iselement(el):
...             yield el
...         else:
...             yield from flat_gen(el)   
... 
>>> nested = [[1,2,3] , [4,5,6] , [7,8] , [9,] , 10 , 11 ]

>>> import collections
>>> list(flat_gen(nested))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

如果您只是在简单列表或元组(任何iterable容器)和非列表或元组对象(即不可编辑对象和不具有更深层嵌套的iterable容器)之间混合嵌套,则可以使用带有list的生成器表达式:

^{pr2}$

相关问题 更多 >