python数据类型串讲(下)

python数据类型串讲(下)

CDA数据分析师 出品

在上一篇文章中讨论了python标准类型中序列的两种:列表和元祖,下面我们继续介绍python的第二种标准类型:字典(dict)。

1、字典dict

顾名思义,字典就像我们日常生活中使用的新华字典,其作用在于根据索引(拼音或偏旁)快速查找到所需内容,而python中的字典也是如此,python中字典的索引称为**“键”(key),由python中不可变的数据类型(如字符串、数值等)构成,具有固定(不可变)、唯一(不可重复)性;python中字典的内容称为"值",其可以为python中的任意标准数据类型的一种或多种。字典中由"键"和"值"构成的数据结构称为"键值对"**,每个"键值对"之间用逗号(,)分隔开,其中键和值分别用冒号(:)分隔,同时整个字典用花括号({ })括起来,如下图所示:

python数据类型串讲(下)

1.1 字典的创建

1.1.1 直接创建

根据上述字典的结构,可用花括号{ }直接创建一个字典。

#用{}直接创建<<< x={‘a’:1,‘b’:2,‘c’:3}<<< print(x){‘a’: 1, ‘b’: 2, ‘c’: 3}

1.1.2 通过内置函数

· 传入参数为键值对

· 通过传入类似"a=1"形式的键值对创建,注意这里的键只能是字符串类型,且不需要加引号。

#通过内置函数dict()创建<<< x=dict(a=1,b=2,c=3)<<< x{‘a’: 1, ‘b’: 2, ‘c’: 3}

· 传入参数为元祖/列表

· 通过传入一序列包含两个值的元组或列表创建,第一个参数为键,第二个参数为值。需要注意的是,当传入的参数为元祖时,元组内部的键值对个数要大于或等于2.

#这四种方式创建的效果都一样<<< dict(((‘a’,1),(‘b’,2))){‘a’: 1, ‘b’: 2}<<< dict(([‘a’,1],[‘b’,2])){‘a’: 1, ‘b’: 2}<<< dict([(‘a’,1),(‘b’,2)]){‘a’: 1, ‘b’: 2}<<< dict([[‘a’,1],[‘b’,2]]){‘a’: 1, ‘b’: 2}

小技巧:可通过dict()结合python另一个内置函数zip()来快速创建字典,先用映射函数zip()将两个长度相等的列表或元祖,根据对应位置压缩为一个包含n个元祖的列表(n为列表或元祖中元素的个数),再用python的内置函数dict()将其转化为字典。

#通过dict()和zip()创建<<< keys=(‘a’,‘b’,‘c’)<<< values=(1,2,3)<<< dict(zip(keys,values)){‘a’: 1, ‘b’: 2, ‘c’: 3}

1.2 字典元素的增删查改

先创建一个示例字典:

#示例<<< names=(‘Amy’,‘CC’,‘Mick’)<<< ages=(18,22,23)<<< dic=dict(zip(names,ages))<<< dic{‘Amy’: 18, ‘CC’: 22, ‘Mick’: 23}

1.2.1 元素的查找

python提供了两种方式查找字典的元素,第一种是以键(key)作为索引值,用中括号[ ]进行索引,与前面列表的索引用法一致;第二种通过内置函数get(),第一个参数为key,第二个参数为报错提示,默认为None,如果在字典中查找到key,则返回key对应的值,如果查找不到key,则返回第二个参数的值。

#用[]查找key为’CC’对应的values<<< dic[‘CC’]22# 用内置函数get()查找key为’CC’对应的values<<< dic.get(‘CC’)22# 用get()设置查找不到返回字符’Error!’<<< dic.get(‘Cc’,‘Error!’)‘Error!’

同时,也可以通过python关键字in判断某个元素是否存在于字典中,存在返回True,否则返回False。

#用关键字in判断元素存在与否<<< 'Cc’in dicFalse<<< 'CC’in dicTrue

1.2.2 元素的修改

与列表中修改元素的方法一致,字典也可以通过直接对查找出来的values进行赋值操作,从而达到修改元素值的效果。

#将字典dic中索引为’Cc’对应的值改为24<<< dic[‘CC’]=24<<< dic{‘Amy’: 18, ‘CC’: 24, ‘Mick’: 23}

1.2.3 元素的增加

在上一步的操作中,当输入的key不存在于字典中时,则会新增加一对键值对,如果没有输入values,则默认values为None。

#新增一对键值对:键为’Jem’,值为’32’<<< dic[‘Jem’]=32<<< dic{‘Amy’: 18, ‘CC’: 24, ‘Mick’: 23, ‘Jem’: 32}

1.2.4 元素的删除

· pop()

· 语法:dict.pop(key,[value])

· 字典的pop()方法用于对原数组删除指定的key及其对应的values,并返回该键值对,第一个参数为需要删除的key,第二个参数为不存在该key时返回的值。

#删除dic中为’Jem’的key及其value,并返回该键值对<<< dic.pop(‘Jem’)32<<< dic{‘Amy’: 18, ‘CC’: 24, ‘Mick’: 23}# 设置pop方法删除元素时若差找不到返回’Rrror!’<<< dic.pop(‘Jam’,‘Eoror!’)‘Eoror!’

这里需要注意与列表中的pop方法区分开,列表中的 pop()方法用于删除指定index索引处的value,若没有输入参 数index,则会默认删除最后一个元素。

· clear()

· 语法:dict.clear( )

· 字典的clear()方法用于对原字典清除所有的键值对数据,无返回值。

#将dic里的所有数据删除<<< dic.clear()<<< dic{}

· del

· 语法:del dict[key]

· del的用法与pop相似,根据给定的key删除键值对,但与pop()方法不同,del没有返回值,若key不存在,则会报KeyError错误。

#用python关键字del删除指定键值对<<< del dic[‘CC’]<<< dic{‘Amy’: 18, ‘Mick’: 23}

1.3 字典的常用方法

1.3.1 dict.keys()

获取字典键值对中的键key

#获取字典dic键值对中的键key<<< dic.keys()dict_keys([‘Amy’, ‘CC’, ‘Mick’])<<< [i for i in dic.keys()][‘Amy’, ‘CC’, ‘Mick’]

1.3.2 dict.values()

获取字典键值对中的值values

#获取字典dic键值对中的值values<<< dic.values()dict_values([18, 22, 23])<<< [i for i in dic.values()][18, 22, 23]

1.3.3 len(dict)

计算字典中元素的个数

#计算字典dic中元素的个数<<< dic{‘Amy’: 18, ‘CC’: 22, ‘Mick’: 23}<<< len(dic)3

1.3.4 dict.items()

以列表的形式返回可遍历的(键,值)元祖。

#以列表的形式返回字典dic<<< dict.items()dict_items([(‘Amy’, 18), (‘CC’, 22), (‘Mick’, 23)])

总结:字典的特点在于其无序性,与序列不同,字典属于python的映射类型,其内部的元素是无序的,不能通过其位置来进行索引或切片,而是通过字典的键(key)进行映射查找;同时,正是这种键值对的结构,使字典查找元素的速度提升很多,不需要像列表那样遍历列表内每个元素,list越长,耗时越长。

2、集合set

python中第三种数据类型的"容器"是集合(set),集合与字典(dict)相类似,其内部存储的元素是无序的,不可以通过位置去进行索引等相关操作。与字典不同的是,集合中只有key,没有value,key可以由python中不可变的数据类型(如字符串、数值等)构成,因此集合中的元素具有无序唯一性

集合的结构也和字典相类似,其内部元素用花括号{ }括起来,如下图所示:

python数据类型串讲(下)

2.1 集合的创建

2.1.1 用{ }直接创建

直接使用花括号{ }将内部元素括起来即可创建一个集合:

#用{ }直接创建<<< se={‘a’,‘b’,‘c’}<<< se{‘a’, ‘b’, ‘c’}<<< type(se)set# 若集合中含重复元素,会自动去重<<< {‘a’,‘b’,‘c’,‘a’}{‘a’, ‘b’, ‘c’}

2.1.2 用函数set()创建

使用函数set()可以将列表、元祖等可迭代对象转化为集合。

#使用以下三种方式创建的效果一样<<< set([‘a’,‘b’,‘c’]){‘a’, ‘b’, ‘c’}<<< set((‘a’,‘b’,‘c’)){‘a’, ‘b’, ‘c’}<<< set({‘a’:1,‘b’:2,‘c’:3}){‘a’, ‘b’, ‘c’}

这里需要注意的是,若需要创建一个空集合,只能使用set( ) 方法创建,不能使用花括号{ }来创建,因为{ }创建的是一个空字典。

2.2 集合元素的增删

由于集合内的元素是无序的,且只有键没有值,因此无法对集合进行元素查找及修改操作,下面主要介绍集合中元素增加及删除的方法。

2.2.1 元素的增加

· set.add(key )

· 使用集合的add( )函数,可将新元素添加到集合中,注意每次只能添加一个元素。

使用add()添加元素<<< se.add(‘d’)<<< set{‘a’, ‘b’, ‘c’, ‘d’}

· set.update(key)

· 使用update()函数可以一次性向集合中添加一个或多个元素,当添加多个元素时,必须是以列表、元祖、字典的等可迭代对象的形式

#使用update()添加元素<<< se.update([‘e’,‘f’])<<< se{‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’}

2.2.2 元素的删除

· set.pop( )

· 集合中pop( )方法与列表中的用法相似,可以删除集合中一个元素并返回该元素,但因为集合的无序性,使用pop( )方法不是删除最后一个元素,而是随机删除。

#使用pop()每次执行结果不一样<<< se.pop()‘c’<<< se.pop()‘d’<<< se{‘a’, ‘b’, ‘e’, ‘f’}

· set.remove( )

· 集合中remove( )的用法也与列表相类似,可将集合内指定元素删除但没有返回值,如果集合不包含该元素,则会报KeyError错误。

#使用remove()删除指定元素<<< se.remove(‘g’)KeyError Traceback (most recent call last) in ----> 1 se.remove(‘g’)KeyError: ‘g’<<< se.remove(‘f’)<<< se{‘a’, ‘b’, ‘e’}

2.3 集合的运算

和我们数学上学的集合一样,python中的集合也可以进行以下四种集合的基本操作:

· 交集:set01&set02

python数据类型串讲(下)

· 集合中实现两个集合进行交集运算的符号是**"&"**,同时也可以通过其内置函数intersection( )来实现。

#用两种方法求集合se1和se2的交集<<< se1={‘a’,‘b’,‘c’}<<< se2={‘a’,‘d’,‘e’}<<< se1&se2{‘a’}<<< se1.intersection(se2){‘a’}

· 并集:set01|set02

python数据类型串讲(下)

· 集合中实现两个集合进行交集运算的符号是**"|"**,同时也可以通过其内置函数union( )来实现。

#用两种方法求集合se1和se2的并集<<< se1={‘a’,‘b’,‘c’}<<< se2={‘a’,‘d’,‘e’}<<< se1|se2{‘a’, ‘b’, ‘c’, ‘d’, ‘e’}<<< se1.union(se2){‘a’, ‘b’, ‘c’, ‘d’, ‘e’}

· 差集:set01-set02

python数据类型串讲(下)

集合中实现两个集合进行差集运算的符号是**"-"**,同时也可以通过其内置函 数different( )来实现,注意集合的前后顺序。

#用两种方法求集合se1和se2的差集<<< se1={‘a’,‘b’,‘c’}<<< se2={‘a’,‘d’,‘e’}<<< se1-se2{‘b’, ‘c’}<<< se1.difference(se2){‘b’, ‘c’}

· 补集:set01^set20

python数据类型串讲(下)

补集也叫"对称差集",集合中实现两个集合进行补集运算的符号是**"^"**, 同时也可以通过其内置函数symmetric_difference( )来实现。

#用两种方法求集合se1和se2的补集<<< se1={‘a’,‘b’,‘c’}<<< se2={‘a’,‘d’,‘e’}<<< se1^se2{‘b’, ‘c’, ‘d’, ‘e’}<<< se1.symmetric_difference(se2){‘b’, ‘c’, ‘d’, ‘e’}