Python实现排列组合:高效算法与应用实例

这是文章《用Python进行排列组合》的第1部分(共3部分)。

一个元素集合的排列和组合是集合元素的不同排列方式。

  • 组合(Combination):元素的集合,其中元素的顺序不重要。
  • 排列(Permutation):元素的排列,其中元素的顺序很重要。

我们将一个集合定义为:

{A, B, C}

以上集合的排列如下:

('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')

以上集合中两个元素一起的组合有以下几种:

('A', 'B')
('A', 'C')
('B', 'C')

在本教程中,我们将学习如何在Python中获取一组元素的排列和组合。我们将研究字符和数字的集合。

我们将使用Python的itertools模块下的combinations()permutations()方法。

让我们开始吧。

数字数据的排列组合

为了使用itertools模块下的permutations()方法,我们首先需要导入该模块。

import itertools

现在让我们定义一个数集。

val = [1, 2, 3, 4]

现在我们使用permutations()方法来获取排列列表。

perm_set = itertools.permutations(val)

上面的代码行提供了一个itertools对象。为了打印出不同的排列,我们将遍历这个对象。

for i in perm_set:
    print(i)

我们得到的输出是:

(1, 2, 3, 4)
(1, 2, 4, 3)
(1, 3, 2, 4)
(1, 3, 4, 2)
(1, 4, 2, 3)
(1, 4, 3, 2)
(2, 1, 3, 4)
(2, 1, 4, 3)
(2, 3, 1, 4)
(2, 3, 4, 1)
(2, 4, 1, 3)
(2, 4, 3, 1)
(3, 1, 2, 4)
(3, 1, 4, 2)
(3, 2, 1, 4)
(3, 2, 4, 1)
(3, 4, 1, 2)
(3, 4, 2, 1)
(4, 1, 2, 3)
(4, 1, 3, 2)
(4, 2, 1, 3)
(4, 2, 3, 1)
(4, 3, 1, 2)
(4, 3, 2, 1)

该部分的完整代码如下所示:

import itertools
 
val = [1, 2, 3, 4]
 
perm_set = itertools.permutations(val)
 
for i in perm_set:
    print(i)

字符串的排列

接下来我们将学习如何获取字符串中字符的排列。

这次我们将使用permutations()方法,但是这次我们将传递一个字符串作为参数。

import itertools
 
s = "ABC"

perm_set = itertools.permutations(s)
for val in perm_set:
    print(val)

输出:

('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')

固定长度的排列

这是文章《用Python进行排列组合》的第2部分(共3部分)。

我们可以找到一个集合的排列,其中每个排列只包含指定数量的元素。这类似于数学中的 nPr(从 n 个元素中取出 r 个元素的排列数)。

下面是查找固定长度排列的代码示例:

import itertools
 
val = [1, 2, 3, 4]
 
perm_set = itertools.permutations(val,2)
 
for i in perm_set:
    print(i)

输出结果:

(1, 2)
(1, 3)
(1, 4)
(2, 1)
(2, 3)
(2, 4)
(3, 1)
(3, 2)
(3, 4)
(4, 1)
(4, 2)
(4, 3)

数字数据的组合

与使用 permutations() 方法类似,我们可以使用 itertools 模块中的 combinations() 方法来获取一组元素的组合。

在调用 combinations() 时,我们需要传递两个参数:第一个参数代表要查找组合的集合,第二个参数代表每个组合的长度。

import itertools
 
val = [1, 2, 3, 4]
 
com_set = itertools.combinations(val, 2)
 
for i in com_set:
    print(i)

结果:

(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)

字符串的组合

我们也可以获取字符串的组合。要获取字符串的组合,可以使用以下代码片段:

import itertools
 
s = "ABC"
 
com_set = itertools.combinations(s, 2)
 
for i in com_set:
    print(i)

输出:

('A', 'B')
('A', 'C')
('B', 'C')

带有替换的组合

itertools 模块下还有一个名为 combinations_with_replacement() 的方法。该方法允许元素在组合中重复出现。

我们来看看它是如何工作的。

为数值集合

import itertools
 
val = [1, 2, 3, 4]
 
com_set = itertools.combinations_with_replacement(val, 2)
 
for i in com_set:
    print(i)

输出结果:

(1, 1)
(1, 2)
(1, 3)
(1, 4)
(2, 2)
(2, 3)
(2, 4)
(3, 3)
(3, 4)
(4, 4)

您可以从上面的输出和常规组合操作的输出中看出区别。在这里,我们有像 (1,1)(2,2) 这样的组合,这在常规组合操作中是不存在的。

对于一个字符串

(此处应补充字符串带有替换的组合示例,原文缺失)

这是文章《用Python进行排列组合》的第3部分(共3部分)。

以下代码演示了如何使用itertools.combinations_with_replacement函数生成带重复的组合:

import itertools
 
val = "ABCD"
 
com_set = itertools.combinations_with_replacement(val, 2)
 
for i in com_set:
    print(i)

上述代码的输出结果如下:

('A', 'A')
('A', 'B')
('A', 'C')
('A', 'D')
('B', 'B')
('B', 'C')
('B', 'D')
('C', 'C')
('C', 'D')
('D', 'D')

结论

本教程详细讲解了如何在Python中查找一个集合的排列和组合。我们利用Python内置的itertools模块,高效地实现了这些排列和组合的计算。

bannerAds