Python 字典

心已入冬 提交于 2019-12-01 09:12:53

字典是一种通过名字引用值的数据结构。这种结构类型称为映射。字典是Python中唯一内建的映射类型

字典中的值并没有特殊的顺序,都存储在一个特定的键(Key)里,键可以是数字、字符串甚至是元组

1.创建

使用dict函数,通过其他映射(比如其他字典)或者(键、值)这样的序列对建立字典

 

 也可以通过关键字参数来创建字典

 

2.基本字典操作

字典的基本行为在许多方面与序列类似:

len(d)  返回d中项(键-值对)的数量

d[k]   返回关联到键k上的值

d[k]=v  将值v关联到键k上

del(d[k]) 删除键为k的项

k in d  检查d中是否含有键为k的项

但也有下面一些重要的区别

键类型:字典的键不一定为整型数据,也可能是其他不可变类型,比如浮点型,字符串或者元组

自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个 值,这一字典就会建立新的项,而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上

成员资格:表达式k in d(d为字典)查找的是键,不是键值,表达式v in l(l为列表)则用来查找值,而不是索引

 1 people = {
 2     'Alice': {
 3         'phone': '2341',
 4         'addr': 'Foo drive 23'
 5     },
 6 
 7     'Beth': {
 8         'phone': '9102',
 9         'addr': 'Bar street 42'
10     },
11 
12     'Cecil': {
13         'phone': '3158',
14         'addr': 'Baz avenue 90'
15     }
16 }
17 
18 labels = {
19     'phone': 'phone number',
20     'addr': 'address'
21 }
22 
23 name = input('Name: ')
24 request = input('Phone number (p) or address (a)? ')
25 
26 if request == 'p': key = 'phone'
27 if request == 'a': key = 'addr'
28 
29 if name in people:  print("%s's %s is %s." % (name, labels[key], people[name][key]))

3.字典的格式化字符串

 使用字典而不是元组来做这个工作时,在每个转换说明符中的%字符后面,可以加上(圆括号括起来的)键,后面再跟上其他的说明元素

除了增加的字符串键之外,转换说明符还是像之前一样

以这种方式使用字典的时候,只要给出的键在字典中找到,就可以获得任意数量的转换说明符,这类字符串格式化在模板系统中非常有用

1 template = '''<html>
2             <head><title>%(title)s</title></head>
3             <body>
4             <h1>%(title)s</h1>
5             <p>%(text)s</p>
6             </body>'''
7 
8 data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'}
9 print(template % data)

4.字典方法

clear()  清除字典中的所有项,这个方法无返回值(返回None)

考察以下两种情况

两种情况中,x和y最初对应同一个字典。情况1中,通过将x关联到一个新的空字典来”清空“它,这对y一点影响都也没有,它还关联到原先的字典。

但如果真的想清空原始字典中的所有元素,必须使用clear方法

 

copy()  返回一个具有相同键-值对的新字典(这个方法实现的是浅复制,因为值本身就是相同的,而不是 副本)

 

 

 副本中替换值的时候,原始字典不受影响,但是如果修改了某个值(原地修改,而不是替换)原始的字典也会改变,因为同样的值也存储在原字典中

可以使用深复制来避免这一问题,复制其包含的所有值,可以使用copy模块的deepcopy函数来完成操作

 

 

fromkeys()  使用给定的键建立新的字典,每个键默认对应的值为None

 也可以直接在所有字典的类型dict上面调用方法

 也可以自己提供默认值

 

get()  一种更宽松的访问字典项的方法,一般来说,在试图访问字典中不存在的项时会出错,但是在使用get()时就不会

 当使用get()访问一个不存在的键时,没有任何异常,得到了None值,还可以自己定义”默认”值,来替换None;如果键存在,get()用起来就像普通的字典查询一样

get()可以使得程序在用户输入未准备的值时也能做出合理的反应,下面是电话簿程序使用get()方法的版本

 1 people = {
 2     'Alice': {
 3         'phone': '2341',
 4         'addr': 'Foo drive 23'
 5     },
 6 
 7     'Beth': {
 8         'phone': '9102',
 9         'addr': 'Bar street 42'
10     },
11 
12     'Cecil': {
13         'phone': '3158',
14         'addr': 'Baz avenue 90'
15     }
16 }
17 
18 labels = {
19     'phone': 'phone number',
20     'addr': 'address'
21 }
22 
23 name = input('Name: ')
24 request = input('Phone number (p) or address (a)? ')
25 
26 key = request
27 if request == 'p': key = 'phone'
28 if request == 'a': key = 'addr'
29 
30 person = people.get(name, {})
31 label = labels.get(key, key)
32 result = person.get(key, 'not available')
33 
34 
35 print("%s's %s is %s." % (name, label, result))

 

 

has_key  与k in d 是一样的,python3中不包括这个函数

 

items()  以列表形式返回可遍历的(键, 值) 元组数组

keys()  以列表形式返回字典中的键

values()  以列表形式返回字典中的值

 

 

setdefault()  类似get()方法,能够获得与给定键相关联的值

 

 当键不存在的时候,setdefault()返回默认值并且相应地更新字典。如果键存在,那么就返回与其对应的值,但不改变字典

默认值是可选的,如果不设定,就默认使用None

 

 

pop()  用来获得给定键的值,然后将这个键-值对从字典中移除

 

 

popitem()  弹出字典中最末尾的项,在希望一个接一个地移除并处理项时,很有用(因为不用首先获取键的列表) 

 

 如果字典已经为空,而使用了此方法,会报出KeyError异常

 

update()  update()可以利用一个字典项更新另外一个字典

 

 提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!