前面介绍的列表和元组都是有序序列,而字典与集合属于无序序列,也就是说,不能通过索引来操作元素。
创新互联建站成都网站建设按需设计网站,是成都网站设计公司,为酒楼设计提供网站建设服务,有成熟的网站定制合作流程,提供网站定制设计服务:原型图制作、网站创意设计、前端HTML5制作、后台程序开发等。成都网站营销推广热线:18982081108
10.1 字典
语法格式:
dictionary= {key1 : value1, key2 : value2, key3 : value3 ,...., key n : value n }
其中,dictionary是字典名称,key表示元素的键,value表示元素的值,键和值必须是成对的。
如:
dict1 = { 'abc': 123, 98.6: 37 }
dict1
{'abc': 123, 98.6: 37}
可以看出,键可以是字符串、数字或者元组,但必须是唯一的;而值可以是任何数据类型,也没有要求是唯一的。
1、创建字典的方法
方法一:同时给定键和值,即“关键字参数”形式。
dictionary=dict(key1=value1,key2=value2,.....,key n=value n)
注意:这里的key 必须符合Python标识符的命名规则。
例:
先使用“{}”创建字典:
dict1={1:'一',2:'二',3:'三',4:'四',5:'五'}
dict1
{1: '一', 2: '二', 3: '三', 4: '四', 5: '五'}
再通过“关键字参数”形式创建:
dict1=dict(1='一',2='二',3='三',4='四',5='五')
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
创建不成功,原因在于key 不符合Python标识符的命名规则。前面已经介绍过,标识符不能用数字表示或者用数字打头。
现在对键如下修改:
dict1=dict(n1='一',n2='二',n3='三',n4='四',n5='五') #在数字前加了一个字符”n”
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五'}
方法二 :使用已经存在的元组和列表通过映射函数创建字典。
格式:dictionary=dict(zip(tuplekey,listvalue))
例:
tuplekey=('n1','n2','n3','n4','n5') #键的序列采用元组
listvalue=['一','二','三','四','五'] #值的序列采用列表
dict1=dict(zip(tuplekey,listvalue))
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五'}
注意:tuple(listname)函数可以将列表转换为元组,list(tuplename)函数可以将元组转换为列表。
2、通过键访问字典
直接获取键的相应元素的值
dict1['n2']
'二'
利用get()方法
dict1.get('n2')
'二'
get()方法也可以带参数,当要访问的键不存在时返回一个字符串。如:
dict1.get('n0','can't find!') #当要查找的键不存在,返回'can't find!'
"can't find!"
3、遍历字典
使用字典对象的items()方法可以获取字典的“键.值对”列表。
for item in dict1.items():
print(item)
('n1', '一')
('n2', '二')
('n3', '三')
('n4', '四')
('n5', '五')
也可以获取具体的每个元素的键和值,如:
for key,value in dict1.items():
print(key,'对应的是',value)
n1 对应的是 一
n2 对应的是 二
n3 对应的是 三
n4 对应的是 四
n5 对应的是 五
4、添加、修改和删除字典元素
使用下面的语句,若指定的键存在,就可以修改该元素的值;若指定的键不存在,则添加该元素。如:
dict1['n6']='六' # 键’n6’不存在,故添加该元素
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五', 'n6': '六'}
dict1['n4']='肆' # 键’n4’存在,故修改该元素
dict1
{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '肆', 'n5': '五', 'n6': '六'}
5、利用推导式建立字典
import random
dict1={i:random.randint(1,100) for i in range(5)}
# 生成元素的键为0到5整数,值为1到100之间的随机数
print(dict1)
运行结果:{0: 28, 1: 59, 2: 79, 3: 30, 4: 88}
10.2 集合
集合是数学中一个很重要的概念,集合具有确定性、互异性、无序性三个基本属性。在Python中,集合同样具有这三个基本属性,其中,确定性是指对象要么是集合的元素,要么不是集合的元素;互异性是指集合中的元素不能重复;无序性是指集合中的元素不分先后次序,可以随意更换位置。
1、集合的创建
直接使用“{}”创建
set1={'春','夏','秋','冬'}
set1
{'秋', '春', '冬', '夏'}
set2={3,2,1,4,5}
set2
{1, 2, 3, 4, 5}
利用已有的列表、元组创建集合
list1=['东','南','西','北']
set3=set(list1)
set3
{'南', '东', '北', '西'}
利用已有的集合建立一个“副本”
set3
{'南', '东', '北', '西'} #set3和set4的值一样
set4=set3
set4
{'南', '东', '北', '西'}
set4.add('中') #给set4添加元素
set4
{'西', '中', '东', '南', '北'} # 这个好理解
set3
{'西', '中', '东', '南', '北'} # 意想不到吧?Set3为什么会发生变化?
再看看简单变量的情况:
a=2
b=a #是不是与前面set4=set3相似
b+=1
b
3
a
2 #但a的值并没有发生改变
从上面集合set3、set4和简单变量a、b的值的变化情况对比,不难发现set3和set4是指向同一地址的对象,而变量a和变量b指向了不同地址,语句b=a是将a的值传递个b,并不是将a的地址传递给b。列表、元组、字典都和集合一样具有这样的性质。
所以,将set4称为set3的“副本”更为恰当。
2、添加和删除元素
set3
{'南', '东', '北', '西'}
set3.add('中') # 添加元素
set3
{'西', '中', '东', '南', '北'} # 集合内的元素是无序的,不要纠结次序的变化
set3.remove('中') # 删除元素
set3
{'西', '东', '南', '北'}
3、集合运算
集合运算包括交()、并(|)、差(-),和数学中的集合运算是一致的。
set3={'南', '东', '北', '西'}
set4={'西', '中', '东', '南', '北'}
set3 set4 #取set3和set4的交集
{'西', '南', '北', '东'}
set3 | set4 #取set3和set4的并集
{'中', '南', '北', '西', '东'}
set3 - set4 #取set3与set4的差,即set3比set4多出来的元素
set()
set4 -set3 #取set4与set3的差,即set4比set3多出来的元素
{'中'}
因为字典是通过键来索引的,关联到相对的值,理论上他的查询复杂度是O(1)。
哈希表(也叫散列表),根据关键值对(Key-value)而直接进行访问的数据结构。它通过把key和value映射到表中一个位置来访问记录,这种查询速度非常快,更新也快。而这个映射函数叫做哈希函数,存放值的数组叫做哈希表。 哈希函数的实现方式决定了哈希表的搜索效率。
“键值对”是组织数据的一种重要方式,广泛应用在Web系统中。键值对的基本思想是将“值”信息关联一个“键”信息,进而通过键信息查找对应值信息,这个过程叫映射。Python语言中通过字典类型实现映射。
Python语言中的字典使用大括号{}建立,每个元素是一个键值对,使用方式如下:
{键1:值1, 键2:值2, ... , 键n:值n}
其中,键和值通过冒号连接,不同键值对通过逗号隔开。字典类型也具有和集合类似的性质,即键值对之间没有顺序且不能重复。
列表类型采用元素顺序的位置进行索引。由于字典元素“键值对”中键是值的索引,因此,可以直接利用键值对关系索引元素。
字典中键值对的索引模式如下,采用中括号格式:
值 = 字典变量[键]
print(d[‘201801’])
输出的也就是: 小明
使用大括号可以创建字典。通过索引和赋值配合,可以向字典中增加元素。
字典是存储可变数量键值对的数据结构,键和值可以是任意数据类型,通过键索引值,并可以通过键修改值。
字典类型有一些通用的操作函数
dict()函数用于生成一个空字典,作用和{}一致
字典类型存在一些操作方法,使用语法形式是:
字典变量.方法名称(方法参数)
d.keys()返回字典中的所有键信息,返回结果是Python的一种内部数据类型dict_keys,专用于表示字典的键。如果希望更好的使用返回结果,可以将其转换为列表类型。
d.values()返回字典中的所有值信息,返回结果是Python的一种内部数据类型dict_values。如果希望更好的使用返回结果,也可以将其转换为列表类型。
d.items()返回字典中的所有键值对信息,返回结果是Python的一种内部数据类型dict_items。当然也可以转成列表类型 即: list(d.items())
d.get(key, default)根据键信息查找并返回值信息,如果key存在则返回相应值,否则返回默认值,第二个元素default可以省略,如果省略则默认值为空。 例如: 就拿上边的数组d 来说 d.get(‘201801’,“不存在”) 相当于一个if语句 如果key 201801 存在 就返回201801 values 不存在就返回 默认值 不存在
d.pop(key, default)根据键信息查找并取出值信息,如果key存在则返回相应值,否则返回默认值,第二个元素default可以省略,如果省略则默认值为空。相比d.get()方法,d.pop()在取出相应值后,将从字典中删除对应的键值对。 和d.get方法类似
d.popitem()随机从字典中取出一个键值对,以元组(key,value)形式返回。取出后从字典中删除这个键值对。
d.clear()删除字典中所有键值对。
此外,如果希望删除字典中某一个元素,可以使用Python保留字del。 即: del d[key]
字典类型也支持保留字in,用来判断一个键是否在字典中。如果在则返回True,否则返回False。
与其他组合类型一样,字典可以遍历循环对其元素进行遍历,基本语法结构如下:
for 变量名 in 字典名
语句块
for循环返回的变量名是字典的索引值。如果需要获得键对应的值,可以在语句块中通过get()方法获得。
以上就是本章的所有内容,感谢大家.
Python 学习的基础(持续更新中......)
同于我用过的其它编程语言,Python 没有 switch / case 语句。为了实现它,我们可以使用字典映射:
这段代码类似于:
Python 代码通常比处理 case 的标准方法更为简短,也可以说它更难理解。当我初次使用 Python 时,感觉很奇怪并且心烦意乱。而随着时间的推移,在 switch 中使用字典的 key 来做标识符变得越来越习以为常。
函数的字典映射
在 Python 中字典映射也可以包含函数或者 lambda 表达式:
虽然 zero 和 one 中的代码很简单,但是很多 Python 程序使用这样的字典映射来调度复杂的流程。
类的调度方法
如果在一个类中,不确定要使用哪种方法,可以用一个调度方法在运行的时候来确定。
很灵活,对吧?
官方说明
官方文档的解释说,“用if... elif... elif... else序列很容易来实现 switch / case 语句”。而且可以使用函数字典映射和类的调度方法。
具体函数有 set(),pop(),update(),items(),keys(),values(),get(),setdefault()
python 字典操作
假设字典为 dics = {0:'a', 1:'b', 'c':3}
二是使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None:
print dics.get('a')
print dics.get('Paul')
None
dict.get(key,default=None) 两个选项 一个 key 一个 default= None ----default可以是任何strings(字符)
2.从字典中取值,若找到则删除;当键不存在时,显示异常key error
[方法] dics.pop('key')
3.给字典添加一个条目。如果不存在,就指定特定的值;若存在,就算了。
[方法] dic.setdefault(key, value)
4. update
a = {'a':1,'b':2}
a.update({'c':3})
a
{'a': 1,'c': 3,'b': 2}
a.update({'c':4})
a
{'a': 1,'c': 4,'b': 2}
dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的。
有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的元素不会重复,这时,set就派上用场了。
python字典的构成形式为:字典是Python语言中唯一的映射类型。
映射类型对象里哈希值(键,key)和悔樱闷指向的对象(值,value)是一对多的关系,通常被认为是可变的哈希表。
字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型。
字典类型与序列类型的区别:
1、存取和访问数据的方式不同。
2、序列类型使用数字类型的键(从序列的开始按数值顺序索引)。
3、映射类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,映射类型的键直接或间接的和存储数据值相关联。
4、映射类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
5、映射类型用键直接“映射”到值。
字典是Python中最强大的数据类型之一
使用字典的注意不能允许一键对应多个值;键必须是可哈希的。
len()返回字典的长度。
hash()返回对象的哈希值,可以用来判断一个对象能否用来作为字典的键。
dict()工厂函数,用来创建字典颂迹。