<p>三种选择:</p>
<ol>
<li><p>可以对嵌套列表求和;<a href="http://docs.python.org/2/library/functions.html#sum" rel="nofollow">^{<cd1>}</a>接受第二个参数,即起始值,将其设置为空列表:</p>
<pre><code>>>> sum(myList[0], [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
</code></pre>
<p>这是因为<code>sum()</code>实际上是作为一个循环实现的:</p>
^{pr2}$
<p>如果起始值是list对象本身,那么它可以与list连接。<code>0 + [1, 2, 3]</code>不能工作,但是{<cd4>}工作得很好。</p></li>
<li><p>您可以将<a href="http://docs.python.org/2/library/functions.html#reduce" rel="nofollow">^{<cd5>}</a>与<a href="http://docs.python.org/2/library/operator.html#operator.add" rel="nofollow">^{<cd6>}</a>一起使用,这与<code>sum()</code>基本相同,但不需要提供起始值:</p>
<pre><code>from operator import add
reduce(add, myList[0])
</code></pre>
<p>如果要不惜一切代价避免进口,可以用<code>lambda a, b: a + b</code>或<code>list.__add__</code>代替{<cd6>}。在</p>
<p>随着嵌套输入列表的增长,<a href="http://docs.python.org/2/library/operator.html#operator.add" rel="nofollow">^{<cd11>}</a>(in place add,for list相当于<code>list.extend()</code>)将迅速成为一个更快的选项:</p>
<pre><code>from operator import iadd
reduce(add, myList[0], [])
</code></pre>
<p>但是这个<em>确实需要一个空列表来开始。</p></li>
<li><p>您可以使用<a href="http://docs.python.org/2/library/itertools.html#itertools.chain.from_iterable" rel="nofollow">^{<cd13>}</a>链接列表:</p>
<pre><code>>>> from itertools import chain
>>> list(chain.from_iterable(myList[0]))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
</code></pre></li>
</ol>
<p>这三种解决方案都要求您使用索引来删除最外层的列表,尽管您也可以将<code>myList</code>中的一个元素作为单个参数传递给带有<code>list(chain.from_iterable(*myList))</code>的{<cd15>}。在</p>
<p>在这些选项中,<code>reduce(add, ...)</code>是最快的:</p>
<pre><code>>>> timeit.timeit("sum(myList[0], [])", 'from __main__ import myList')
1.2761731147766113
>>> timeit.timeit("reduce(add, myList[0])", 'from __main__ import myList; from operator import add')
1.0545191764831543
>>> timeit.timeit("reduce(lambda a, b: a.extend(b) or a, myList[0], [])", 'from __main__ import myList')
2.225532054901123
>>> timeit.timeit("list(chain.from_iterable(myList[0]))", 'from __main__ import myList; from itertools import chain')
2.0208170413970947
</code></pre>
<p>比较<code>iadd</code>与{<cd19>}:</p>
<pre><code>>>> timeit.timeit("reduce(add, myList[0])", 'from __main__ import myList; from operator import add')
0.9298770427703857
>>> timeit.timeit("reduce(iadd, myList[0], [])", 'from __main__ import myList; from operator import iadd')
1.178157091140747
>>> timeit.timeit("reduce(add, myListDoubled)", 'from __main__ import myList; myListDoubled = myList[0] + myList[0]; from operator import add')
2.3597090244293213
>>> timeit.timeit("reduce(iadd, myListDoubled, [])", 'from __main__ import myList; myListDoubled = myList[0] + myList[0]; from operator import iadd')
1.730151891708374
</code></pre>
<p>您可以使用递归来避免使用循环,使其适用于任意嵌套的列表:</p>
<pre><code>def flatten(lst):
try:
return flatten(sum(lst, []))
except TypeError:
return lst
</code></pre>
<p>演示:</p>
<pre><code>>>> flatten(myList)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> flatten(myList + myList)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]
</code></pre>