我有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$)的复杂性更好。但是,除了循环和列表压缩之外,还有其他更快的"pythonic“方法吗?使用任何图书馆功能,等等?
发布于 2022-01-25 21:44:26
我认为列表连接将比通过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('%3d ms' % (t * 1e3), func.__name__)发布于 2022-01-25 21:19:49
使用标准库中的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://stackoverflow.com/questions/70855633
复制相似问题