【问题标题】:Permutate all posibilities for N lists with M length of middle array置换具有 M 长度的中间数组的 N 个列表的所有可能性
【发布时间】:2019-06-24 13:49:55
【问题描述】:

我正在尝试雕刻一些文件。为了做到这一点,我想置换所有的可能性。有 3 个可能的开始,40 个可能的中间块和 3 个可能的结束。

问题是我们不知道中间块有多长。它可以是 1 个块长,也可以是 40 个块长。我们唯一确定的是这些块是连续出现的,因为它是我正在尝试恢复的 PNG。

我已经尝试用很多 for 循环自己编写代码,但到目前为止没有成功。 我确实尝试了以下代码。

s= [[headersList],[idatList],[iendList]]
    print(list(itertools.product(*s)))

我希望输出类似于,

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

等等。 唯一的条件是开始和结束块必须在数组的相应开始和结束处。中间块的大小必须连续为 1 到最大 40。

【问题讨论】:

  • 您能否给出一个示例输入和相应示例输出的具体示例?
  • 你能澄清一下 1,2,7 是否有效吗?我想这是无效的。它是否应该始终以 1 开头? 3,4,5 是有效的中间块吗?然后您只有 40 个中间组合,并且您尝试生成总共 3x40x3 = 360 个排列。
  • @GreenCloakGuy 这是一个十六进制数据文件,所以在这里发布它很长。它应该是一个 PNG 块、N 个 idat 块和一个 iend 块。
  • @EmmetB 第一个和最后一个数字应该在 1 到 3 之间。因为有 3 个起始块和 3 个结束块。中间块是N长,最多40个。我知道的是中间块中的数字是连续出现的。

标签: python list random size permutation


【解决方案1】:

以下是您应该如何使用产品:

from itertools import product

head   = range(1,4)
tail   = range(1,4)
middle = range(1,41)
combos = [(h,list(range(1,m+1)),t) for t,h,m in product(tail,head,middle)]


print(combos)
# [(1, [1], 1), (1, [1, 2], 1), (1, [1, 2, 3], 1), 
#  (1, [1, 2, 3, 4], 1), (1, [1, 2, 3, 4, 5], 1), ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多