通过列表理解来平整列表清单

Anu*_*rma 13 python list-comprehension list python-2.7

我试图在python中使用list comprehension来压缩列表.我的名单有点像

[[1, 2, 3], [4, 5, 6], 7, 8]
Run Code Online (Sandbox Code Playgroud)

只是为了打印这个列表中的单个项目我写了这段代码

   def flat(listoflist):
     for item in listoflist:
             if type(item) != list:
                     print item
             else:
                     for num in item:
                             print num  
>>> flat(list1)
1
2
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)

然后我使用相同的逻辑通过列表理解展平我的列表我得到以下错误

    list2 = [item if type(item) != list else num for num in item for item in list1]
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)

如何使用列表理解来展平这种类型的列表?

Gre*_*ade 12

没有人给出通常的答案:

def flat(l):
  return [y for x in l for y in x]
Run Code Online (Sandbox Code Playgroud)

StackOverflow周围有这个问题的愚蠢.

  • 您的代码不适用于OP提供的列表,因为他的列表包含不可迭代的对象,即整数。但是,如果列表中的每个项目都是可迭代对象,则您的代码可以正常工作。请参阅下面我的评论。 (2认同)

Ash*_*ary 10

>>> from collections import Iterable
>>> from itertools import chain
Run Code Online (Sandbox Code Playgroud)

一内胆:

>>> list(chain.from_iterable(item if isinstance(item,Iterable) and
                    not isinstance(item, basestring) else [item] for item in lis))
[1, 2, 3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)

可读版本:

>>> def func(x):                                         #use `str` in py3.x 
...     if isinstance(x, Iterable) and not isinstance(x, basestring): 
...         return x
...     return [x]
... 
>>> list(chain.from_iterable(func(x) for x in lis))
[1, 2, 3, 4, 5, 6, 7, 8]
#works for strings as well
>>> lis = [[1, 2, 3], [4, 5, 6], 7, 8, "foobar"]
>>> list(chain.from_iterable(func(x) for x in lis))                                                                
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']
Run Code Online (Sandbox Code Playgroud)

使用嵌套列表理解:(比较慢itertools.chain):

>>> [ele for item in (func(x) for x in lis) for ele in item]
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']
Run Code Online (Sandbox Code Playgroud)

  • 这对于使用 2.x 的提问者来说很好,但值得注意的是,3.x 用户应该使用 `str` 而不是 `basestring`。 (2认同)