【问题标题】:Special kind of permutation特殊排列
【发布时间】:2021-12-19 16:16:09
【问题描述】:

我正在编写一些代码以从列表中生成所有可能的排列。此类产品仅限于一种特定尺寸。我的代码适用于常规排列,但我不知道如何获得遵循这种逻辑的排列。我应该得到遵循这种纵横交错模式的所有排列,其中第一个元素后面跟着另一个元素,然后重复直到产品达到大小 z,进入一个大数组。 例如,给定一个像 [0,1,2,3]z=3 这样的数组, 应该返回类似[[0,1,0][1,0,1][2,0,2][0,2,0][0,3,0][0,4,0]...] 当然,输出会根据 z 变化,所以,如果我们有 z=4,则数组将有大小为 4 的子数组,如 [[0,1,0,1],[1,0,1,0],[2,0,2,0],[0,2,0,2], etc.] 从根本上说,您只需要交替原始数组中的两个元素,以便它们形成那种类型的 a-b/a-b-a/a-b-a-b/模式,因此一次取两个元素。 这是我的 z 大小的基本排列代码。

def comb(k,array):
if k<=0:
    return [[]]
else:
    final=[]
    for part in comb(k-1,array):
        for e in array:
            final.append([e]+part)
        return final

我不想使用任何库,因为我正在专门研究递归,这在学习方面是毫无意义的。谢谢。

【问题讨论】:

  • 笛卡尔积和排列是非常不同的东西。这就像问一个数学问题,但使用“加法”和“乘法”这两个词可以互换。老实说,我不知道您希望结果列表是什么样的。您能否提供一些可以更好地表达您的意图的示例输入和输出?
  • 你是对的。我的意思是排列,而不是笛卡尔积。示例中提供了输入:)

标签: python list


【解决方案1】:

使用itertools.product:

from itertools import product

lst = [0,1,2,3]

result = list(product(lst,repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (0, 3, 2), (0, 3, 3), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 0), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 0), (3, 0, 1), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 0), (3, 3, 1), (3, 3, 2), (3, 3, 3)]

【讨论】:

  • 谢谢!我试图不导入任何东西,因为我正在专门研究递归
【解决方案2】:

itertools模块尝试permutations

l = [0, 1, 2, 3]
z = 3
out = list(permutations(l, r=z))
print(out)

# Output:
[(0, 1, 2),
 (0, 1, 3),
 (0, 2, 1),
 (0, 2, 3),
 (0, 3, 1),
 (0, 3, 2),
 (1, 0, 2),
 (1, 0, 3),
 (1, 2, 0),
 (1, 2, 3),
 (1, 3, 0),
 (1, 3, 2),
 (2, 0, 1),
 (2, 0, 3),
 (2, 1, 0),
 (2, 1, 3),
 (2, 3, 0),
 (2, 3, 1),
 (3, 0, 1),
 (3, 0, 2),
 (3, 1, 0),
 (3, 1, 2),
 (3, 2, 0),
 (3, 2, 1)]

检查permutationscode 大致相等。

对于z=4

l = [0, 1, 2, 3]
z = 4
out = list(permutations(l, r=z))
print(out)

# Output:
[(0, 1, 2, 3),
 (0, 1, 3, 2),
 (0, 2, 1, 3),
 (0, 2, 3, 1),
 (0, 3, 1, 2),
 (0, 3, 2, 1),
 (1, 0, 2, 3),
 (1, 0, 3, 2),
 (1, 2, 0, 3),
 (1, 2, 3, 0),
 (1, 3, 0, 2),
 (1, 3, 2, 0),
 (2, 0, 1, 3),
 (2, 0, 3, 1),
 (2, 1, 0, 3),
 (2, 1, 3, 0),
 (2, 3, 0, 1),
 (2, 3, 1, 0),
 (3, 0, 1, 2),
 (3, 0, 2, 1),
 (3, 1, 0, 2),
 (3, 1, 2, 0),
 (3, 2, 0, 1),
 (3, 2, 1, 0)]

【讨论】:

  • 不幸的是,它不遵循模式,我正在尝试正确学习递归,所以没有 itertools。我已经在我的帖子中对其进行了编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多