第四章 字典
1. 映射mapping——通过名字引用值的数据结构,字典是唯一内建的映射类型。可以使用任何不可变的对象标识元素,常用字符串和元组。
key——value,可以是字符串、元组、数字
创建字典
>>>直接创建
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}
>>>使用dict()函数创建
>>> items = [('name', 'Gumby'), ('age', 42)] #1
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>>
>>> d = dict(name='Gumby', age=42) #2
>>> d
{'age': 42, 'name': 'Gumby'}
>>>
>>> dict() #空字典
{}
2. 字典操作
>>> d = {'age': 42, 'name': 'Gumby'}
>>> a = len(d) #长度
>>> a
2
>>> d['age'] #d[k]返回关联到键k上的值
42
>>> d['no'] = '123' #d[k]=v,将值v关联到键k上
自动添加
>>> d
{'age': 42, 'name': 'Gumby', 'no': '123'}
>>> del d['no'] #del d[k] 删除键为k的项
>>> d
{'age': 42, 'name': 'Gumby'}
>>> 'age' in d # k in d检查d中是否含有键为k的项, 注意是 键
# 在字典中检查键的成员资格,比在列表中检查值的成员资格效率高
True
>>> x = [] #空列表
>>> x[42] = 'Foobar' #将值关联到一个并不存在的索引,报错,需要[None] * 43, x[42]='Foobar'才可
Traceback (most recent call last):
File "<pyshell#125>", line 1, in <module>
x[42] = 'Foobar' #将值关联到一个并不存在的索引,报错
IndexError: list assignment index out of range
>>> x = {} #空字典
>>> x[42] = 'Foobar' #可以直接自动添加关联
>>> x
{42: 'Foobar'}
完整示例
#简单数据库
#使用人名作为键的字典,每个人使用另一个字典来表示,其键'phone'和'addr'分别表示电话号码和地址
people = {
'Alice':{
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth':{
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil':{
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
#针对电话号码和地址使用的描述性标签,在输出时用到
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = raw_input('Name: ')
#查找电话号码还是地址,使用正确的按键
request = raw_input("Phone number (p) or address (a)? ")
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
#如果名字是字典中的有效键才打印信息
if name in people: print "%s's %s is %s." %(name, labels[key], people[name][key])
#运行结果
Name: Alice
Phone number (p) or address (a)? a
Alice's address is Foo drive 23.
3. 使用字典格式化字符串
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}
>>> "Ceil's phone number is %(Ceil)s." %phonebook #使用字典格式化的方法
"Ceil's phone number is 0123."
#例子
>>> template = '''<html>
<head><title>%(title)s</title></head>
<body>
<h1>%(title)s</h1>
<p>%(text)s</p>
</body>
</html>'''
>>> data = {'title': 'My Home Page', 'text': 'Welcome to my homepage!'}
>>> print template %data
<html>
<head><title>My Home Page</title></head>
<body>
<h1>My Home Page</h1>
<p>Welcome to my homepage!</p>
</body>
</html>
4. 字典方法
#(1)
>>> #clear()请空字典,无返回值或返回值为None
>>> #例1不使用clear()
>>> x = {}
>>> y = x #x,y指向同一字典
>>> x['key'] = 'value' #自动添加
>>> y
{'key': 'value'}
>>> x = {} #x指向另一新的字典,而原字典不变,y仍指向原来的字典
>>> y
{'key': 'value'}
>>> #例2使用clear()
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x.clear() #使用clear()清空了原始字典
>>> y
{}
#(2)
>>> #copy()浅复制,在副本中替换值时原始字典受影响,而修改受
>>> x = {'a': '1', 'b': ['2','3']}
>>> y = x.copy()
>>> y['a'] = '11' #替换
>>> y['b'].remove('2') #修改
>>> y
{'a': '11', 'b': ['3']} #副本值替换,修改
>>> x
{'a': '1', 'b': ['3']} #原始字典只修改,不替换
#(3)深复制
>>> #copy模块中的deepcopy()
>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['Alfred', 'Bertrand'] #原始字典
>>> d
{'names': ['Alfred', 'Bertrand']}
>>> c = d.copy(); #浅复制
>>> dc = deepcopy(d) #深复制
>>> d['names'].append('Clive') #对原字典修改
>>> c
{'names': ['Alfred', 'Bertrand', 'Clive']} #浅复制也修改了
>>> dc
{'names': ['Alfred', 'Bertrand']} #深复制未被修改
#(4)fromkeys
>>> #fromkeys使用给定的键建立新的字典,每个键对应的值默认为None
>>> {}.fromkeys(['name', 'age'])
{'age': None, 'name': None}
>>> #法二
>>> dict.fromkeys(['name', 'age'])
{'age': None, 'name': None}
>>> #可以修改默认值
>>> dict.fromkeys(['name', 'age'], 'Unknown')
{'age': 'Unknown', 'name': 'Unknown'}
#(5)get
>>> #通常使用不存在键访问时,会报错,但使用get方法,可以不报错
>>> d = {}
>>> print d['name']
Traceback (most recent call last):
File "<pyshell#213>", line 1, in <module>
print d['name']
KeyError: 'name'
>>> #使用get不会报错
>>> print d.get('name')
None
>>> #更改默认值
>>> d.get('name', 'N/A')
'N/A'
>>> #如果键存在,get用起来就像普通的字典查询
>>> d['name'] = 'Eric'
>>> d.get('name')
'Eric'
使用get()的完整示例
# 使用get()的简单数据库
people = {
'Alice':{
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth':{
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil':{
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
#针对电话号码和地址使用的描述性标签,在输出时用到
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = raw_input('Name: ')
#查找电话号码还是地址,使用正确的按键
request = raw_input("Phone number (p) or address (a)? ")
key = request #新加内容,请求既不是'p'也不是'a'
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
#使用get()提供默认值
person = people.get(name, {}) #若输入的name不存在,则用空字典表示该person
label = labels.get(key, key) #若用户输入的不是p或a,则将输入内容作为label
result = person.get(key, 'not available') #若key(即用户输入不存在),则输出notavailable
print "%s's %s is %s." %(name, label, result)
#运行结果
>>>
Name: sun
Phone number (p) or address (a)? a
sun's address is not available.
>>> ================================ RESTART ================================
>>>
Name: Alice
Phone number (p) or address (a)? p
Alice's phone number is 2341.
>>> ================================ RESTART ================================
>>>
Name: Alice
Phone number (p) or address (a)? test
Alice's test is not available.
方法续
#(1)items
>>> #items将字典以列表形式返回
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}
>>> phonebook.items()
[('Beth', '9102'), ('Alice', '2341'), ('Ceil', '0123')]
#(2)iteritems
>>> #iteritems将字典以迭代器形式返回
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}
>>> it = phonebook.iteritems()
>>> it
<dictionary-itemiterator object at 0x01F145C0>
>>> list(it) #将literator(迭代器)转为list
[('Beth', '9102'), ('Alice', '2341'), ('Ceil', '0123')]
#(3)pop()
>>> #pop()根据键获得值并弹出,并从字典中删除键-值
>>> d = {'x':1, 'y':2}
>>> d.pop('x')
1 #根据键'x'查找值1,并弹出1
>>> d #删除x--1之后的字典
{'y': 2}
>>>
#(4)popitem()
>>> #popitem()随机弹出某项键-值
>>> d = {'1': 'a', '2': 'b', '3': 'c'}
>>> d.popitem() #随机弹出1---a
('1', 'a')
>>> d #删除了1---a
{'3': 'c', '2': 'b'}
>>>
#(5)setdefault() 类似get方法
>>> #setdefault()类似get(),根据键获取值,若无键则返回默认值None,默认值可重设
>>> d = {}
>>> print d.setdefault('name') #不存在该键,返回默认值None
None
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d['name'] = 'Gumby'
>>> d.setdefault('name')
'Gumby'
#(6)update()
>>> #update()若键不存在则添加,存在则覆盖
>>> d = {'1': 'a', '2': 'b', '3': 'c'}
>>> x = {'3': 'cdef'}
>>> d.update(x) #键‘3’存在,更改‘3’对应的值
>>> d
{'1': 'a', '3': 'cdef', '2': 'b'}
>>> y = {'4': 'test'} #键‘4’不存在,添加该键值对
>>> d.update(y)
>>> d
{'1': 'a', '3': 'cdef', '2': 'b', '4': 'test'}
#(7)values()
>>> #values()以列表形式返回字典中的值,此列表可包含重复值
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d
{1: 1, 2: 2, 3: 3}
>>> d.values()
[1, 2, 3]
总结:
dict
分享到:
相关推荐
Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...
python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf ...
Python深度学习实战——基于Pytorch全书电子教案完整版ppt整套教学课件最全教学教程.pptx
Python学习笔记——运算符 运算符: 赋值运算符 算术运算符 关系运算符 逻辑运算符 位运算
Python学习笔记——对象和类
Python学习笔记——输入input(),input()使用,两个练习。
Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf ...
对应Python学习笔记——变量、print、转义字符。变量的类型、命名规则、print的用法、字符串的表示以及转义字符
python学习笔记1——(廖雪峰教程,菜鸟教程)python基础 python学习笔记1——(廖雪峰教程,菜鸟教程) >>> classmates = ['Michael', 'Bob', 'Tracy'] >>> len(classmates) 3 ⽤索引来访问list中每⼀个位置的元素...
Python学习笔记——socket通信相关资源文件 内部包括server1 2 3 + windows版 nc
CSP202109-2 非零段划分 学习笔记 python(csdn)————程序
python训练营python学习笔记(csdn)————程序
[实训解析]Python 计算思维训练——SAR图像处理-第2关:读入一个目录下所有图像_5307.pdf
用Python学习线性代数——向量在Jupyter Notebook下运行的文件,内容包括行列向量的基本表示,向量的基本运算等。详情请见https://tuenity.blog.csdn.net/article/details/104070768。
python计算机视觉学习————图像内容分类 计算机视觉.pdf
Python基础入门教程,适合Python初学者,文档内容包括, 目录 前言 i 第一章 程序 1 1.1 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 什么是调试 . . . . . . . . . . . . . . . ....
python学习笔记——集合与字典1. 集合的基本概念1.1 set(x)函数1.2 集合类型的10个操作函数2. 字典的基本概念2.1 字典的索引2.2 字典的操作2.3 字典小结 1. 集合的基本概念 集合类型和数学集合中的概念一致,即包含0...
1.6 第一个Python程序 1.7 集成开发工具 2、Python语法基础 2.1 Python中的输入输出函数 2.2 Python中的注释 2.3 Python中的变量 3、Python中的基本数据类型 3.1 整型-int 3.2 浮点型-float 3.3 布尔类型-...
外部python调用houdini python(csdn)————程序