Python中的排列组合

时间:2020-02-23 14:42:23  来源:igfitidea点击:

一组元素的排列和组合是该组元素的不同排列。

  • 组合是顺序无关紧要的元素的集合
  • 排列是顺序重要的一组排列。

让我们考虑一个集合为:

{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')

固定长度的排列

我们可以找到集合的置换,其中每个置换中仅采用指定数量的元素。
这与数学领域的nPr相似。

查找固定长度排列的代码如下:

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下使用groups()来获取集合的组合。

在调用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模块下还有另一种方法,称为groups_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)之类的组合,它们在常规组合操作中不存在。

对于一个字符串

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')