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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

七周七语言(卷2)

七周七语言(卷2)

【美】Bruce A. Tate(泰特)、Fred Daoud(达乌德)、Ian Dees(迪斯) / 7ML翻译组 / 人民邮电出版社 / 2016-12 / 59

深入研习对未来编程具有重要意义的7种语言 Lua、Factor、Elixir、Elm、Julia、Idris和MiniKanren 本书带领读者认识和学习7种编程语言,旨在帮助读者探索更为强大的编程工具。 本书延续了同系列的畅销书《七周七语言》《七周七数据库》和《七周七Web开发框架》的体例和风格。 全书共8章,前7章介绍了Lua、Factor、Elm、Elixir、Jul......一起来看看 《七周七语言(卷2)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换