我有这样的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
您要做的是将列表展平.根据Python的Zen,你正在努力做正确的事情.引用那个
Flat优于嵌套.
所以你可以像这样使用列表理解
newlist = [item for items in newlist for item in items]
Run Code Online (Sandbox Code Playgroud)或者您可以使用chain从itertools这样的
from itertools import chain
newlist = list(chain(*newlist))
Run Code Online (Sandbox Code Playgroud)或者您可以使用chain.from_iterable,无需解压缩列表
from itertools import chain
newlist = list(chain.from_iterable(newlist))
Run Code Online (Sandbox Code Playgroud)使用sum功能
newlist = sum(newlist, [])
Run Code Online (Sandbox Code Playgroud)使用reduce功能
newlist = reduce(lambda x,y: x+y, newlist)
Run Code Online (Sandbox Code Playgroud)用operator.add.这将是比快reduce用lambda版本.
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))用来展平嵌套列表.
len*_*310 12
最简单的一个:
newlist = sum(newlist, [])
print newlist
Run Code Online (Sandbox Code Playgroud)
temp = []
for small_list in newlist:
temp += small_list
newlist = temp
Run Code Online (Sandbox Code Playgroud)
这应该可以做到。
| 归档时间: |
|
| 查看次数: |
40748 次 |
| 最近记录: |