【问题标题】:A function incorporating all combination list包含所有组合列表的功能
【发布时间】:2020-05-31 01:36:09
【问题描述】:

我正在尝试创建一个包含列表所有组合元素的函数。细节是这样的。

这是当列表元素为 [1,2,3] 且 n=4 时。 例如,

elements=[1,2,3]
all_data=[]

for x_1 in elements:
    tmp=[]
    tmp.append(x_1)
    all_data.append(tmp)
    for x_2 in elements:
        tmp=[]
        tmp.append(x_1)
        tmp.append(x_2)
        all_data.append(tmp)
        for x_3 in elements:
            tmp=[]
            tmp.append(x_1)
            tmp.append(x_2)
            tmp.append(x_3)
            all_data.append(tmp)
            for x_4 in elements:
                tmp=[]
                tmp.append(x_1)
                tmp.append(x_2)
                tmp.append(x_3)
                tmp.append(x_4)
                all_data.append(tmp)
all_data

输出是→

[[1],
 [1, 1],
 [1, 1, 1],
 [1, 1, 1, 1],
 [1, 1, 1, 2],
 [1, 1, 1, 3],
 [1, 1, 2],
 [1, 1, 2, 1],
 [1, 1, 2, 2],
 [1, 1, 2, 3],
 [1, 1, 3],
 [1, 1, 3, 1],
 [1, 1, 3, 2],
 [1, 1, 3, 3],
 [1, 2],
 [1, 2, 1],
 [1, 2, 1, 1],
 [1, 2, 1, 2],
 [1, 2, 1, 3],
 [1, 2, 2],
 [1, 2, 2, 1],
 [1, 2, 2, 2],
 [1, 2, 2, 3],
 [1, 2, 3],
 [1, 2, 3, 1],
 [1, 2, 3, 2],
 [1, 2, 3, 3],
 [1, 3],
 [1, 3, 1],
 [1, 3, 1, 1],
 [1, 3, 1, 2],
 [1, 3, 1, 3],
 [1, 3, 2],
 [1, 3, 2, 1],
 [1, 3, 2, 2],
 [1, 3, 2, 3],
 [1, 3, 3],
 [1, 3, 3, 1],
 [1, 3, 3, 2],
 [1, 3, 3, 3],
 [2],
 [2, 1],
 .....
 [3, 2, 3],
 [3, 2, 3, 1],
 [3, 2, 3, 2],
 [3, 2, 3, 3],
 [3, 3],
 [3, 3, 1],
 [3, 3, 1, 1],
 [3, 3, 1, 2],
 [3, 3, 1, 3],
 [3, 3, 2],
 [3, 3, 2, 1],
 [3, 3, 2, 2],
 [3, 3, 2, 3],
 [3, 3, 3],
 [3, 3, 3, 1],
 [3, 3, 3, 2],
 [3, 3, 3, 3]]

但我想要实现的是使用(可能)循环语句将这个功能做 n 次。 所以,我想做的函数输出应该是这样的,

[[1],
[1,1],
......
[1,1,1,1,......,1], #(1 of n times)
[1,1,1,1,......,2],
......
[6],
[6,6],
......
[6,6,6,6,......,6]] #(n times)

虽然我花了几乎整整一周的时间来解决这个问题,但还没有找到任何解决方案。 谁能给我一些提示或碰巧知道任何想法? 任何线索都非常受欢迎。

谢谢。

【问题讨论】:

标签: python list function numpy


【解决方案1】:

看来您想要的是 [1, 4] 中 k 的列表中 k 个元素的笛卡尔积。
如果是这种情况,您可以使用 itertools.product 并计算 k=1,2,3,4 的乘积

>>> res = list(itertools.chain.from_iterable(itertools.product([1,2,3], repeat=k) for k in range(1,5)))
>>> res
[(1,), (2,), (3,), (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3), (1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 2, 1), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 1), (1, 1, 3, 2), (1, 1, 3, 3), (1, 2, 1, 1), (1, 2, 1, 2), (1, 2, 1, 3), (1, 2, 2, 1), (1, 2, 2, 2), (1, 2, 2, 3), (1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 3, 1, 1), (1, 3, 1, 2), (1, 3, 1, 3), (1, 3, 2, 1), (1, 3, 2, 2), (1, 3, 2, 3), (1, 3, 3, 1), (1, 3, 3, 2), (1, 3, 3, 3), (2, 1, 1, 1), (2, 1, 1, 2), (2, 1, 1, 3), (2, 1, 2, 1), (2, 1, 2, 2), (2, 1, 2, 3), (2, 1, 3, 1), (2, 1, 3, 2), (2, 1, 3, 3), (2, 2, 1, 1), (2, 2, 1, 2), (2, 2, 1, 3), (2, 2, 2, 1), (2, 2, 2, 2), (2, 2, 2, 3), (2, 2, 3, 1), (2, 2, 3, 2), (2, 2, 3, 3), (2, 3, 1, 1), (2, 3, 1, 2), (2, 3, 1, 3), (2, 3, 2, 1), (2, 3, 2, 2), (2, 3, 2, 3), (2, 3, 3, 1), (2, 3, 3, 2), (2, 3, 3, 3), (3, 1, 1, 1), (3, 1, 1, 2), (3, 1, 1, 3), (3, 1, 2, 1), (3, 1, 2, 2), (3, 1, 2, 3), (3, 1, 3, 1), (3, 1, 3, 2), (3, 1, 3, 3), (3, 2, 1, 1), (3, 2, 1, 2), (3, 2, 1, 3), (3, 2, 2, 1), (3, 2, 2, 2), (3, 2, 2, 3), (3, 2, 3, 1), (3, 2, 3, 2), (3, 2, 3, 3), (3, 3, 1, 1), (3, 3, 1, 2), (3, 3, 1, 3), (3, 3, 2, 1), (3, 3, 2, 2), (3, 3, 2, 3), (3, 3, 3, 1), (3, 3, 3, 2), (3, 3, 3, 3)]
>>> len(res)
120

如果您不需要所有值,您可以遍历它们中的每一个:

for k in range(1,4):
   for t in itertools.product([1,2,3], repeat=k):
      ... 

【讨论】:

  • 非常感谢您!令人惊讶的是它起作用了! (内存是另一个问题,应该没问题!)
  • 碰巧知道是否可以使用循环函数代替 itertools?实际上,当我以 1000 之类的大 n 值运行时会发生内存错误。(我正在寻找 [1,2,3] 的某些组合,仅当每个列表中每个值的总和等于 n 时)
  • 请注意,根据您的目标,可能有比暴力破解更有效的方法来处理您的问题。
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 2020-07-16
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多