Python for Kids
  • 0 前言
  • 1 编程环境准备
  • 2 运算符和表达式
  • 3 掌握变量
  • 4 字符串
  • 5 获取用户的输入
  • 6 条件判断
  • 7 条件判断实操
  • 8 FOR循环
  • 9 循环和列表
  • 10 WHILE循环
  • 11 WHILE循环实操
  • 12 WHILE循环再实操
  • 13 多重循环
  • 14 再谈列表
  • 15 初见函数
  • 16 函数实操
  • 17 选择排序
  • 18 冒泡排序
  • 19 递归算法之一
  • 20 递归算法实操
  • 21 快速排序
  • 22 汉诺塔游戏
  • 23 递推算法
  • 24 分治算法
  • 25 集合与组合
  • 26 贪心算法
  • 27 字典和键值对
  • 28 广度优先搜索算法
  • 29 数组和向量化计算
  • 30 随机和模拟
  • 31 数据可视化
  • 32 文件读取和分析
Powered by GitBook
On this page
  • 大纲
  • 什么是集合
  • 数学中的组合

Was this helpful?

25 集合与组合

集合中的元素都是不重复的

大纲

  • 什么是集合

  • 数学中的组合

什么是集合

前面的课程中我们学习了一些有用的数据类型,例如列表和字典,它们都可以处理一系列的数据,只是侧重点不同。有时候我们还希望从一个新角度来处理数据,例如说去除重复的元素。此时,集合就是一种非常有用的数据类型,我们来看一下python中如何来操纵集合。

x_list = [1,2,3,3]

x_list是一个列表,包括了四个元素,其它有两个是重复的,下面使用set来将它变成一个没有重复值的集合。

x_set = set(x_list)
print(x_set)
type(x_set)
{1, 2, 3}

set

我们可以从一个list来通过set函数来创建集合,可以看到集合的最重要特点在于,集合中的元素没有重复值。集合也可以通过大括号来定义,重复元素会被去除掉。

x_set = {1,2,3,3}
print(x_set)
{1, 2, 3}

一个经常用到的技巧是先创建一个空的集合,然后会往里面添加元素。

x_set = set()
x_set.add(2)
print(x_set)
{2}

类似列表一样,可以用in来判断元素是否处于集合之中。

2 in x_set
True

集合运算的特点在于可以计算并集、交集等运算。例如我们来看下面两个集合。

x_set = {'one','two',1,2}
y_set = {'two',1,'three'}

可以通过运算符|来计算到并集

x_set | y_set
{1, 2, 'one', 'three', 'two'}

通过&来计算得到交集

x_set & y_set
{1, 'two'}

通过比较符来看一个集合是否另一个集合的子集。

{1,2} <= x_set
True

还可以计算出一个集合中哪些元素是另一个集合中没有的。

x_set - y_set
{2, 'one'}

还可以通过update函数来将两个集合的元素进行合并。

x_set.update(y_set)
print(x_set)
{1, 2, 'two', 'three', 'one'}

小结:集合和列表的区别是集合中的元素不会重复,而且不同集合间可以进行求交集,求并集等集合特有的操作处理。

数学中的组合

如果你有10张扑克牌,从这些牌中随意抽二张牌出来做一个组合,这种不重复的组合会有多少种呢,这是数学上经典的组合问题。我们先用一个有5个数字元素的集合来看一下。

x_set = {1,2,3,4,5}
y_set = x_set.copy()

这里我们定义了两个集合,分别都是由1到5这五个数字构成的,注意我们使用了copy函数,使y_set的内容和x_set一样。

for x in x_set:
    print(x)
1
2
3
4
5

然后用一个循环来遍历集合x,当x的某个数字取出来时,我们并不需要x和y重复的数字,所以使用remove函数把y中的数字删除,然后再用一个嵌套循环来遍历集合y。这样可以看到两个集合的组合最终会是什么样子。

for x in x_set:
    y = y_set.remove(x)
    for y in y_set:
        print(x,y)
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

用这个思路,我们来定义一个函数combin,这个函数的基本代码都是上面所讲到的双重循环,只不过增加的部分是用到一个列表output_list来存放组合后的元素,要注意一点,这里(x,y)组合对,我们叫作元组,元组和列表很相似,你也可以用方括号来代替,构成一个列表。

def combin(x_set):
    output_list = list()
    y_set = x_set.copy()
    for x in x_set:
        y = y_set.remove(x)
        for y in y_set:
            output_list.append((x,y))
    return output_list
combin(x_set)
[(1, 2),
 (1, 3),
 (1, 4),
 (1, 5),
 (2, 3),
 (2, 4),
 (2, 5),
 (3, 4),
 (3, 5),
 (4, 5)]

这个函数可以对x_set这个数字集合进行组合遍历,得到所有可能的两两组合。输入的内容可以不止是数字,也可以是字符串的一个集合。

x_set={'张','李','王','赵'}
combin(x_set)
[('张', '王'), ('张', '李'), ('张', '赵'), ('王', '李'), ('王', '赵'), ('李', '赵')]

和排序是类似的,我们虽然自己写了一个组合函数,其实python内部也有现成的组合函数,可以直接使用。不过要注意的是,这些内置函数是存放在一些模块中,我们需要告诉程序,我们需要从某个仓库里取出某个函数工具来用,这种操作称为加载模块。例如我们来加载导入一个模块中的函数

from itertools import combinations

上面的代码就是从itertools模块中,加载导入了其中一个叫作 combinations的函数。就好比是我们安装好的python是一个大大的仓库,仓库中的工具需要拿出来放到操作台上才能使用,加载导入就是这个动作。加载后就可以自由的使用这个函数了,这个函数有一个参数就是组合的方式,可以构成两元素组合,也可以三元素组合。

list(combinations(x_set,2))
[('张', '王'), ('张', '李'), ('张', '赵'), ('王', '李'), ('王', '赵'), ('李', '赵')]
list(combinations(x_set,3))
[('张', '王', '李'), ('张', '王', '赵'), ('张', '李', '赵'), ('王', '李', '赵')]

小结:可以用集合来解决组合问题,python中有很多工具,这些工具需要加载导入才能使用,加载导入的语句就是from 某个模块 import 某个工具。其中计算组合的工具就叫做combinations。

Previous24 分治算法Next26 贪心算法

Last updated 4 years ago

Was this helpful?