我有 6 個串列(部分),sec1通過sec6. 我想加入他們以形成一份清單。
例子:
sec1 = [[1,2,3],[4,5,6]]
sec2 = [[7,8,9], [6], [1,2]]
如果我加入這兩個部分,我應該得到:
sec_join = [[1,2,3,7,8,9], [1,2,3,6], [1,2,3,1,2], [4,5,6,7,8,9], [4,5,6,6], [4,5,6,1,2]]
現在我有 6 個這樣的部分,我想相應地加入它們。
筆記:len(sec_join) = len(sec1)*len(sec2)....*len(sec6)
我可以使用 6 個 for 回圈來做到這一點
[[[[[[sec_join.append(x1 x2 x3 x4 x5 x6) for x1 in sec1] for x2 in sec2] for x3 in sec3] for x4 in sec4] for x5 in sec5] for x6 in sec6]
但是上面的方法是O($n^6$)。是否有可能以更好的時間復雜度來做到這一點?
注意:在我的例子中, 的元素sec1...sec6是整數元組而不是整數,因此排序可能會很混亂。
編輯:
我知道它不能做得比O($n^6$)復雜性更好。不過,除了 6 個 for 回圈和串列理解之外,還有什么“pythonic”方法可以更快地做到這一點?使用任何庫函式等?
uj5u.com熱心網友回復:
我認為串列連接會比通過chain.
sec_join = sec1
for sec in sec2, sec3, sec4, sec5, sec6:
sec_join = [head tail
for head in sec_join
for tail in sec]
通過以不同的方式組合可能會進一步加快速度,但我必須知道實際的串列大小。
如果您的串列大小大致相同,這可能是最快的,可以最大限度地減少迭代次數:
sec_join = sec6
for sec in sec5, sec4, sec3, sec2, sec1:
sec_join = [head tail
for head in sec
for tail in sec_join]
一個小基準:
134 ms myrtlecat
46 ms Kelly
代碼(在線試用!):
from itertools import chain, product
sec1 = [[1,2,3],[4,5,6]]*3
sec2 = [[7,8,9], [6], [1,2]]*3
def Kelly(sec1,sec2,sec3,sec4,sec5,sec6):
sec_join = sec6
for sec in sec5, sec4, sec3, sec2, sec1:
sec_join = [head tail
for head in sec
for tail in sec_join]
return sec_join
def myrtlecat(sec1,sec2,sec3,sec4,sec5,sec6):
return [list(chain(*x)) for x in product(sec1, sec2, sec3, sec4, sec5, sec6)]
from timeit import *
args = sec1,sec2,sec1,sec2,sec1,sec2
expect = myrtlecat(*args)
result = Kelly(*args)
print(result == expect)
for a in expect, result: print(len(a))
for func in [myrtlecat, Kelly]*3:
t = min(repeat(lambda: func(*args), number=1))
print('= ms' % (t * 1e3), func.__name__)
uj5u.com熱心網友回復:
itertools從標準庫中使用:
from itertools import chain, product
sec1 = [[1,2,3],[4,5,6]]
sec2 = [[7,8,9], [6], [1,2]]
sec_join = [list(chain(*x)) for x in product(sec1, sec2)]
對于所有 6 做:
sec_join = [list(chain(*x)) for x in product(sec1, sec2, sec3, sec4, sec5, sec6)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/422806.html
標籤:
