[英]flattening list if sublists are same length
我有一個列表,例如[[1,2], [3,4], [5,6], [7,8], [9,10]]
。 我想得到[1,2,3,4,5,6,7,8,9,10]
。
這個問題為平整列表提供了一些非常好的選擇。 此處給出的答案適用於可變長度子列表。 不過在這里,我知道每個子列表都有相同的長度(特別是長度2)。
我想知道是否有可能利用同類子列表的長度來改進我鏈接到的問題中給出的答案。 特別是,有什么方法比[item for sublist in l for item in sublist]
更能使該列表變平?
編輯:通過“更好”,我的意思是對於很長的列表來說速度更快。
編輯:
我沒有提到的一件事-我不在乎平展列表的順序(但我在乎多重性)
import timeit
import itertools
def f0():
l=[[1,2]]*99
[item for sublist in l for item in sublist]
def f1():
l=[[1,2]]*99
list(itertools.chain.from_iterable(l))
def f2():
l = [[1,2]]*99
z = map(list,zip(*l))
z[0].extend(z[1])
print timeit.timeit("f0()", setup="from __main__ import f0, f1, f2", number=10000)
print timeit.timeit("f1()", setup="from __main__ import f0, f1, f2", number=10000)
print timeit.timeit("f2()", setup="from __main__ import f0, f1, f2", number=10000)
產生輸出
0.13874912262
0.103307008743
0.10813999176
我的zip
功能可以更快地完成嗎?
有一點時間表明列表理解比itertools
版本稍快(對於短列表-Hackaholic的回答表明,對於長列表而言,反之亦然):
>>> import timeit
>>> timeit.timeit("[item for sublist in a for item in sublist]",
setup="import itertools; a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]")
1.7200839519500732
>>> timeit.timeit("list(itertools.chain.from_iterable(a))",
setup="import itertools; a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]")
2.0097079277038574
如果您可以避免構建整個列表 ,而不是通過chain.from_iterable
的輸出進行迭代,而不是將其傳遞給list
構造函數,則迭代方法的主要優點就在於。
如果要對數組進行操作且性能是關鍵考慮因素,請考慮使用numpy
,盡管它不是標准庫的一部分, 但速度要快得多(一旦擁有數組):
>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
>>> a
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
>>> a.ravel()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> timeit.timeit("a.ravel()",
setup="import numpy as np; a = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])")
0.36390113830566406
import itertools
a = [[1,2], [3,4], [5,6], [7,8], [9,10]]
list(itertools.chain.from_iterable(a))
輸出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
現在在這里比較時間:
>>> timeit.timeit("list(itertools.chain.from_iterable(a))",setup='import itertools;a = [[1,2], [3,4], [5,6], [7,8], [9,10]]')
0.9853601455688477
>>> timeit.timeit("[ y for x in a for y in x]",setup='a = [[1,2], [3,4], [5,6], [7,8], [9,10]]')
0.9124641418457031
對於大型列表:
這是為什么首選迭代器的結果:
>>> timeit.timeit("list(itertools.chain.from_iterable(a))",setup='import itertools;a = zip(range(100),range(100))',number=1000000)
8.213459014892578
>>> timeit.timeit("[ y for x in a for y in x]",setup='a=zip(range(100),range(100))',number=1000000)
12.833590984344482
從小的列表來看, list comprehension
是好的,但是對於大的列表,您需要使用iterators
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.