python3 第十四章 - 数据类型之Dictionary(字典)

栏目: Python · 发布时间: 7年前

内容简介:python3 第十四章 - 数据类型之Dictionary(字典)

python 中字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值(key=>value)对用冒号( : )分割,每个对之间用逗号( , )分割,整个字典包括在花括号( {} )中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }
  • 键必须是唯一的,但值则不必。
  • 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print('Michael的成是:', d['Michael'])

以上代码,输出:

Michael的成是: 95

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。dict就是第二种实现方式。

1、访问字典里的值

把相应的键放入熟悉的方括弧,如下实例:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}

print("dict['Name']: ", dict['Name'])
print("dict['Age']: ", dict['Age'])

以上代码,输出:

dict['Name']:  roy
dict['Age']:  1

如果key不存在,dict就会报错:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
print("dict['sex']: ", dict['sex'])

以上代码,输出:

Traceback (most recent call last):
  File "D:/python/teaching/01.py", line 2, in <module>
    print("dict['sex']: ", dict['sex'])
KeyError: 'sex'

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}

if 'sex' in dict:
    print("dict['sex']: ", dict['sex'])
else:
    print('没有找到key=sex的元素')

以上代码,输出:

没有找到key=sex的元素

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}

if dict.get('sex'):
    print("dict['sex']: ", dict['sex'])
else:
    print(dict.get('sex','没有找到key=sex的元素'))  # 自己指了一个value

以上代码,输出:

没有找到key=sex的元素

注意:返回None的时候Python的交互环境不显示结果。

2、修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict['Age'] = 100  # 更新 Age
dict['sex'] = '男'  # 添加 sex

print('dict[\'Age\'] :', dict['Age'])
print('dict[\'sex\'] :', dict['sex'])

以上代码,输出:

dict['Age'] : 100
dict['sex'] : 男

3、删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

显示删除一个字典用del命令,如下实例:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict['Age'] = 100  # 更新 Age
dict['sex'] = '男'  # 添加 sex

del dict['Age']  # 删除键 'sex' 
print('dict :', dict)

以上代码,输出:

dict : {'Name': 'roy', 'Class': 'First', 'sex': '男'}

也可以用 clear ()清空字典:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict.clear()  # 清空字典
print('dict :', dict)

以上代码,输出:

dict : {}

也可以删除整个字典:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
del dict # 删除字典
print('dict :', dict)

以上代码,输出:

dict : <class 'dict'>

执行 del 操作后字典不再存在了

要删除一个key,用 pop(key) 方法,对应的value也会从dict中删除:

dict = {'Name': 'roy', 'Age': 1, 'Class': 'First'}
dict.pop('Name')  # 删除键 'Name'
print('dict :', dict)

以上代码,输出:

dict : {'Age': 1, 'Class': 'First'}

注意,dict内部存放的顺序和key放入的顺序是没有关系的。

和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是 不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Designing for Emotion

Designing for Emotion

Aarron Walter / Happy Cog / 2011-10-18 / USD 18.00

Make your users fall in love with your site via the precepts packed into this brief, charming book by MailChimp user experience design lead Aarron Walter. From classic psychology to case studies, high......一起来看看 《Designing for Emotion》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器