如何展平列表/嵌套列表列表?

use*_*220 3 python python-2.7

我有这样的python代码:

newlist =[[52, None, None], [129, None, None], [56, None, None], [111, None, None],  
          [22, None, None], [33, None, None], [28, None, None], [52, None, None],  
          [52, None, None], [52, None, None], [129, None, None], [56, None, None],  
          [111, None, None], [22, None, None], [33, None, None], [28, None, None]]
Run Code Online (Sandbox Code Playgroud)

我想要的newlist是:

newlist =[52, None, None,129, None, None,56, None, None,111, None, None,22, 
          None, None,33, None, None,28, None, None,52, None, None,52, None,  
          None,52, None, None,129, None, None,56, None, None, 111, None,  
          None,22, None, None,33, None, None,28, None, None]
Run Code Online (Sandbox Code Playgroud)

有办法解决吗?

the*_*eye 46

您要做的是将列表展平.根据PythonZen,你正在努力做正确的事情.引用那个

Flat优于嵌套.

  1. 所以你可以像这样使用列表理解

    newlist = [item for items in newlist for item in items]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者您可以使用chainitertools这样的

    from itertools import chain
    newlist = list(chain(*newlist))
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者您可以使用chain.from_iterable,无需解压缩列表

    from itertools import chain
    newlist = list(chain.from_iterable(newlist))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用sum功能

    newlist = sum(newlist, [])
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用reduce功能

    newlist = reduce(lambda x,y: x+y, newlist)
    
    Run Code Online (Sandbox Code Playgroud)
  6. operator.add.这将是比快reducelambda版本.

    import operator
    newlist = reduce(operator.add, newlist)
    
    Run Code Online (Sandbox Code Playgroud)

编辑:为了完整起见,包括在Python中列出列表列表中的答案.

我尝试在Python 2.7中对所有这些进行计时,就像这样

from timeit import timeit
print(timeit("[item for items in newlist for item in items]", "from __main__ import newlist"))
print(timeit("sum(newlist, [])", "from __main__ import newlist"))
print(timeit("reduce(lambda x,y: x+y, newlist)", "from __main__ import newlist"))
print(timeit("reduce(add, newlist)", "from __main__ import newlist; from operator import add"))
print(timeit("list(chain(*newlist))", "from __main__ import newlist; from itertools import chain"))
print(timeit("list(chain.from_iterable(newlist))", "from __main__ import newlist; from itertools import chain"))
Run Code Online (Sandbox Code Playgroud)

在我的机器上输出

2.26074504852
2.45047688484
3.50180387497
2.56596302986
1.78825688362
1.61612296104
Run Code Online (Sandbox Code Playgroud)

因此,最有效的方法是list(chain.from_iterable(newlist))在Python 2.7中使用.在Python 3.3中进行相同的测试

from timeit import timeit
print(timeit("[item for items in newlist for item in items]", "from __main__ import newlist"))
print(timeit("sum(newlist, [])", "from __main__ import newlist"))
print(timeit("reduce(lambda x,y: x+y, newlist)", "from __main__ import newlist; from functools import reduce"))
print(timeit("reduce(add, newlist)", "from __main__ import newlist; from operator import add; from functools import reduce"))
print(timeit("list(chain(*newlist))", "from __main__ import newlist; from itertools import chain"))
print(timeit("list(chain.from_iterable(newlist))", "from __main__ import newlist; from itertools import chain"))
Run Code Online (Sandbox Code Playgroud)

在我的机器上输出

2.26074504852
2.45047688484
3.50180387497
2.56596302986
1.78825688362
1.61612296104
Run Code Online (Sandbox Code Playgroud)

因此,无论是Python 2.7还是3.3,都可以list(chain.from_iterable(newlist))用来展平嵌套列表.

  • @tMJ:考虑等效的 for 循环。第一个是`for j in l: for i in j: newlist.append(i)`,第二个是`for i in j: for j in l: newlist.append(i)`。 (2认同)

len*_*310 12

最简单的一个:

newlist = sum(newlist, [])
print newlist
Run Code Online (Sandbox Code Playgroud)


Chr*_*ian 5

尝试:

newlist = [j for i in newlist for j in i]
Run Code Online (Sandbox Code Playgroud)


tMJ*_*tMJ 2

temp = []
for small_list in newlist:
    temp += small_list
newlist = temp
Run Code Online (Sandbox Code Playgroud)

这应该可以做到。


归档时间:

查看次数:

40748 次

最近记录:

12 年,10 月 前