首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最有效的连接6节的方法是不需要6 for循环的端到端。

最有效的连接6节的方法是不需要6 for循环的端到端。
EN

Stack Overflow用户
提问于 2022-01-25 21:02:50
回答 2查看 60关注 0票数 0

我有6个列表(部分),sec1通过sec6。我想加入他们,以便组成一个名单。

示例:

代码语言:javascript
复制
sec1 = [[1,2,3],[4,5,6]]
sec2 = [[7,8,9], [6], [1,2]]

如果我加入这两部分,我应该得到:

代码语言:javascript
复制
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循环来完成这个任务。

代码语言:javascript
复制
[[[[[[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“方法吗?使用任何图书馆功能,等等?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-25 21:44:26

我认为列表连接将比通过chain更快。

代码语言:javascript
复制
sec_join = sec1
for sec in sec2, sec3, sec4, sec5, sec6:
    sec_join = [head + tail
                for head in sec_join
                for tail in sec]

通过不同的方式组合,可能会进一步加快速度,但我必须知道实际的列表大小。

如果列表大小相同,这可能是最快的,将迭代次数最小化:

代码语言:javascript
复制
sec_join = sec6
for sec in sec5, sec4, sec3, sec2, sec1:
    sec_join = [head + tail
                for head in sec
                for tail in sec_join]

一个小小的基准:

代码语言:javascript
复制
134 ms myrtlecat
 46 ms Kelly

代码(在网上试试!):

代码语言:javascript
复制
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__)
票数 1
EN

Stack Overflow用户

发布于 2022-01-25 21:19:49

使用标准库中的itertools

代码语言:javascript
复制
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人,请:

代码语言:javascript
复制
sec_join = [list(chain(*x)) for x in product(sec1, sec2, sec3, sec4, sec5, sec6)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70855633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档