字典{'键':'值','名字':'电话号码'}
映射:通过名称来访问其各个值的数据结构
列表:将一系列值组合成数据结构并通过编号来访问各个值
字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下
键可能是数、字符串或元组
字典由键(必须唯一,可以是任意数据类型但是唯一即可)及其相应的值组成,这种键-值对称为项
键为名字,值为电话号码
每个键与其值之间都用冒号(:)分隔,项之间用逗号分隔,整个字典放在花括号内
空字典(没有任何项)用两个花括号表示{}。
phones = {
'yanyu':'159368','huangjiaju':'787084','huangjiaiqnag':'784512369','yeshirong':'963214587'}
创建和使用字典
函数dict,从其他映射(如其他字典)或键-值对序列创建字典
message = [('name','yanyu'),('age',22)]
yanyu = dict(message)
yanyu#结果为:{'name': 'yanyu', 'age': 22}
beyond = dict(name="huangjiaju",age=31)
beyond#结果为:{'name': 'huangjiaju', 'age': 31}
成员资格in
在字典中查找的键
,而不是值
在列表中查找的是值
,而不是索引
'''
将字符串"beyond"赋给一个空列表中索引为15的元素
这显然不可能,因为没有这样的元素
除非首先初始化列表
'''
x = []
x[15] = "beyond"#报错
#改正:初始化列表y
y = [None] * 16
y[15] = "beyond"
y#结果为:[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'beyond']
'''
将字符串"beyond"赋给一个空字典的键15
'''
z = {
}
z[15] = "beyond"
z#结果为:{15: 'beyond'}
将字符串格式设置功能用于字典
format_map,通过一个映射来提供所需的信息
phone = {
"yanyu":"1512369","jiaju":'147852','jiaqiang':"789654"}
"jiaju's phone number is {jiaju}.".format_map(phone)#结果为:"jiaju's phone number is 147852."
可指定任意数量的转换说明符,条件是所有的字段名都是包含在字典中的键
template = '''<html>
<head><title>{title}</title></head>
<body>
<h1>{title}</h1>
<p>{text}</p>
</body>'''
data = {
'title': 'My Home Page', 'text': 'Welcome to my home page!'}
print(template.format_map(data))
#结果为:
<html>
<head><title>My Home Page</title></head>
<body>
<h1>My Home Page</h1>
<p>Welcome to my home page!</p>
</body>
字典方法
1,clear,删除所有的字典项,什么都不返回(或者说返回None)
d = {
}
d['name'] = "beyond"
d['age'] = 31
d#结果为:{'name': 'beyond', 'age': 31}
Y = d.clear()
d#结果为:{}
print(Y)#结果为:None
x和y最初都指向同一个字典,将一个空字典赋给x来“清空”它,这对y没有任何影响,它依然指向原来的字典
要删除原来字典的所有元素,必须使用clear,这样做,y也将是空的
x = {
}
y = x
x['key'] = 'value'
y#结果为:{'key': 'value'}
x = {
}
x#结果为:{}
y#结果为:{'key': 'value'}
x = {
}
y = x
x['key'] = 'value'
y#结果为:{'key': 'value'}
x.clear()
x#结果为:{}
y#结果为:{}
2,copy,返回一个新字典,其包含的键-值对与原来的字典相同
(这个方法执行的是浅复制,因为值本身是原件,而非副本)
原件x,副本y,替换副本中的值,原件不受影响;修改副本中的值,原件会发生变化,因为原件指向的也是被修改的值
x={
'name':'yanyu','habby':['eat','drink','sing']}
y = x.copy()
y['name'] = "huangjiaju"#替换
y['habby'].remove('eat')#修改
y#结果为:{'name': 'huangjiaju', 'habby': ['drink', 'sing']}
x#结果为:{'name': 'yanyu', 'habby': ['drink', 'sing']}
为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值
可使用模块copy中的函数deepcopy
d为原件,c为浅复制,C为深复制
浅复制:替换原件不受影响,修改(append向后追加为修改的一种)原件会受影响
深复制:与原件相互独立,与对原件操作无任何影响
from copy import deepcopy
d = {
}
d['names'] = ['yanyu', 'beyond']
c = d.copy()
C = deepcopy(d)
d['names'].append('Huangjiaju')
c#结果为: {'names': ['yanyu', 'beyond', 'Huangjiaju']}
C#结果为:{'names': ['yanyu', 'beyond']}
d#结果为:{'names': ['yanyu', 'beyond', 'Huangjiaju']}
3,fromkeys,创建一个新字典,其中包含指定的键,且每个键对应的值都是None
{
}.fromkeys(['name', 'age'])#结果为:{'name': None, 'age': None}
也可以直接对dict调用方法fromkeys
dict.fromkeys(['name', 'age'])#结果为:{'name': None, 'age': None}
也可提供特定的值
dict.fromkeys(['name', 'age'], '(unknown)')#结果为:{'name': '(unknown)', 'age': '(unknown)'}
4,get,为访问字典项提供了宽松的环境
如果你试图访问字典中没有的项,将引发错误;而使用get不会这样
d = {
}
d['names'] = "beyond"
print(d['name'])#结果为:报错 访问不存在的键
print(d.get('name'))#结果为:None 没有引发异常,而是返回None
d.get('name',"errorover")#结果为:errorover 没有引发异常,而是返回指定的错误信息
d.get("names")#结果为:'beyond'
5,items,返回一个包含所有字典项的列表(字典视图),其中每个元素都为(key, value)的形式,字典项在列表中的排列顺序不确定
d = {
'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
d.items()#结果为:dict_items([('Question', 'Do you like beyond?'), ('Answer', 'Yes'), ('Sure?', 666)])
返回值属于一种名为字典视图的特殊类型dict_items
确定其长度以及对其执行成员资格检查
d = {
'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
it = d.items()
len(it)#结果为:3
('Sure?', 666) in it#结果为:True
视图的一个优点是不复制,它们始终是底层字典的反映,本源和视图是一致的,操作视图,本源也会跟着操作
d = {
'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
it = d.items()
d['Sure?'] = 0
('Sure?',666) in it#结果为:False
d['Sure?'] = 1
('Sure?',1) in it#结果为:True
将字典项复制到列表中
d = {
'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
list(d.items())#结果为:[('Question', 'Do you like beyond?'), ('Answer', 'Yes'), ('Sure?', 666)]
6,keys,返回一个字典视图,其中包含指定字典中的键
d = {
'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
d.keys()#结果为:dict_keys(['Question', 'Answer', 'Sure?'])
7,pop,可用于获取与指定键相关联的值,并将该键-值对从字典中删除
d = {
'x': 1, 'y': 2}
d.pop('x')结果为:1
d:结果为:{'y': 2}
8,popitem,随机地弹出一个字典项
方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念
d = {
'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
d.popitem()#结果为:('Sure?', 666)
d#结果为:{'Question': 'Do you like beyond?', 'Answer': 'Yes'}
字典没有与在列表末尾添加一个元素(append)对应的方法
这是因为字典是无序的,类似的方法毫无意义
9,setdefault,通过键获取相关联的值,若不包含指定的键,则自动添加指定的键值对
指定的键不存在时,setdefault返回指定的值并相应地更新字典
指定的键存在,就返回其值,并保持字典不变
与get一样,值是可选的,如下的no find和NO;如果没有指定,默认为None
d = {
}
d.setdefault('name', 'no find')结果为:'no find'
d:结果为:{'name': 'no find'}
d['name'] = 'beyond'
d.setdefault('name', 'NO')结果为:'beyond'
d:结果为:{'name': 'beyond'}
print(d.setdefault('age'))#结果为:None
d#结果为:{'name': 'beyond', 'age': None} 不存在即添加
10,update,使用一个字典中的项来更新另一个字典
对于通过参数提供的字典,将其项添加到当前字典中
如果当前字典包含键相同的项,就替换它
d = {
'title': 'Python Web Site',
'url': 'http://www.python.org',
'changed': 'Mar 14 22:09:15 MET 2021'
}
x = {
'title': 'Python Language Website'}
d.update(x)
d#结果为:{'title': 'Python Language Website', 'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2021'}
11,values,返回一个由字典中的值组成的字典视图
不同于方法keys,方法values返回的视图可能包含重复的值
d = {
}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
d.values()结果为:dict_values([1, 2, 3, 1])
要对字典执行字符串格式设置操作,不能使用format和命名参数,而必须使用format_map
本章节介绍的新函数
函数 | 描述 |
---|---|
dict(seq) | 从键-值对、映射或关键字参数创建字典 |