组合数据类型概述
组合数据类型可以将多个数据组织起来,根据数据组织方式的不同,Python的组合数据类型可分成三类:序列类型、集合类型和映射类型,如图1所示。
图1 组合数据类型的分类
下面对图1中的这三种类型进行介绍。
(1)序列存储一组排列有序的元素,每个元素的类型可以不同,通过索引可以锁定序列中的指定元素。
(2)集合同样存储一组数据,它要求其中的数据必须唯一,但不要求数据间有序。
(3)映射类型的数据中存储的每个元素都是一个键值对,通过键值对的键可以迅速获得对应的值。
序列类型
序列类型来源于数学概念中的数列。数列是按一定顺序排成一列的一组数,每个数称为这个数列的项,每项不是在其它项之前,就是在其它项之后。存储n项元素的数列{an}的定义如下:
需要注意的是,数列的索引从0开始。通过索引i可以访问数列中的第i-1项,例如通过s1可获取数列{Sn}中的第2项。
序列类型在数列的基础上进行了拓展,Python中的序列支持双向索引:正向递增索引和反向递减索引,如图2所示。
图2 序列的索引体系
正向递增索引从左向右依次递增,第一个元素的索引为0,第二个元素的索引为1,以此类推;反向递减索引从右向左依次递减,最后一个元素的索引为-1,倒数第二个元素的索引为-2,以此类推。
Python中的序列主要有三种:字符串、列表和元组,关于它们的介绍如下:
(1) 字符串是由单一字符组成的不可修改的序列类型。
(2) 列表是一个可以修改的序列类型,使用相对更加灵活。
(3) 元组是一个不可变的序列类型,构建好以后不可以进行任何修改。
上述序列中的字符串已在第3章中讲解,后续会在第6.2节对另外两种序列——列表和元组做进一步讲解。
集合类型
数学中的集合是指具有某种特定性质的对象汇总而成的集体,其中构建集合的这些对象称为该集合的元素。例如,成年人集合的每一个元素都是已满18周岁的人。通常用大写字母如A、B、S、……表示集合,用小写字母如a、b、c、……表示集合的元素。集合中的元素具有三个特征,具体如下。
确定性:给定一个集合,那么任何一个元素是否在集合中就确定了。例如,地球的四大洋构成一个集合,其内部的元素太平洋、大西洋、印度洋、北冰洋是确定的。
互异性:集合中的元素互不相同。
无序性:集合中的元素没有顺序,顺序不同但元素相同的集合可视为同一集合。
Python集合与数学中的集合概念一致,也具备以上三个特性。Python要求放入集合中的元素必须是不可变类型,Python中的整型、浮点型、字符串类型和元组属于不可变类型,列表、字典及集合本身都属于可变的数据类型。对于所有的数据类型而言,它们只要能进行哈希运算,就可以作为集合中的元素出现。
映射类型
在数学中,设A、B是两个非空集合,若按某个确定的对应法则f,使集合A中的任意一个元素x,在集合B中都有唯一确定的元素y与之对应,则称f为从集合A到集合B的一个映射。映射关系示例如图3所示。
图3 映射关系实例
映射类型也称做可变的哈希表(散列表),哈希表是一种数据结构,表中存储存在映射关系的键值对,其中值为实际存储的数据,键为查找数据时使用的关键字。哈希表具有很好的查询性能,使用键可以快速地定位值。
Python中同样采用“键-值”这种形式存储数据间的映射关系。字典是Python唯一的内建映射类型,字典的键必须遵守以下两个原则:
(1)每个键只能对应一个值,不允许同一个键在字典中重复出现。
(2)字典中的键是不可变类型。
多学一招:哈希算法
哈希(hash,散列)算法是将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是原数据唯一且极其紧凑的数值表示形式,哪怕只更改原数据的一个字母,再次散列后产生的都是不同的值。若要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。
Python提供了适用于哈希算法的函数hash(),该函数可以获取大多数数据(如字符串、数字)的哈希值。例如:
>>> hash("HeiMa")
1296313009587961352
>>> hash("123456")
-8765639574853590066
>>> hash("HeiMa123456")
9132461567425907503
由此看出,哈希值与哈希前的数据组合无关。