Python、字典

字典的使用

通过键名可以快速查找到键值。
在python中对字典进行了构造,让我们可以轻松查到某个特定的键,从而通过键找到对应的值。
假如要创建一个可以存储学生姓名和学号的小型数据库,应该怎么做?我们用以前学习过的列表实现。
example:

>>> names=['小王','小李','小张']
>>> numbers=['001','002','003']
>>> print('小李的学号是:',numbers[names.index('小李')])            #通过 name.index('小李')获取小李的索引值同步对应numbers中去
小李的学号是: 002

上述例子如果是用字典表述,更加简单了。如下所示:
example:

>>> names_numbers={'小王':'001','小李':'002','小张':'003'}
>>> print('小李的学号是:',names_numbers['小李'])
小李的学号是: 002

创建和使用字典

字典的格式如下:

>>> d={key1:value1,key2:value2}

字典由多个键及其对应的键值构成的对组成。(把键/值对称为项) 字典的每个键值对用冒号分割,每个项之间用逗号分割,整个字典包括在花括号{}中。空字典不包括任何项,由两个大括号组成,如{}。
字典示例:

>>> dict1 =  {  "123":"ABC"}
>>> dict1
{'123': 'ABC'}
>>> dict2={0:'a',1:'b',2:'c'}
>>> dict2
{0: 'a', 1: 'b', 2: 'c'}

dict函数

可以用dict函数通过其他映射(如其他字典)或键值序列对建立字典。

>>> student=[('name','小萌'),('number','1001')]
>>> student
[('name', '小萌'), ('number', '1001')]
>>> print(dict(student))
{'name': '小萌', 'number': '1001'}
>>> dict(name="小仓",number="005")
{'name': '小仓', 'number': '005'}

字典的基本操作

(1)修改字典
向字典添加新内容的方法是增加新键值对,修改或删除已有键值对。

>>> student
{'小萌': '1001', '小智': '1002', '小强': '1005'}
>>> student['小强']='1003'                                               #通过键名修改键值
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003'}
>>> student['小张']='1004'                                               #新增键值对 
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003', '小张': '1004'}
>>> print('小张的学号:%(小张)s'% student)                                #格式化字符串
小张的学号:1004

(2)删除字典元素
del 字典名称 删除整个字典
del 字典名称(键名) 删除字典中键名相关的键值对

>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003', '小张': '1004'}
>>> del student['小张']
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003'}

(3)字典键的特性
字典值可以没有限制的取任何python对象,既可以是标准对象,也可以是用户定义的对象,但键不行。需要记住以下两点:
不允许同一个键出现两次。创建时如果同一个键名先后被赋值两次,后面的值会被记住。
键名必须不可变,可以用数字/字符串或元组充当,不能用列表。
(4)len函数
len(dict) 用于计算字典元素的个数,即键的总数。

>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003'}
>>> len(student)
3

(5)type函数
tpye(variable)函数返回输入的变量类型
判断变量variable的数据类型

>>> type(student)
<class 'dict'>

字典的格式化字符串

example:

>>> student
[('name', '小萌'), ('number', '1001')]
>>> ab=dict(student)
>>> ab
{'name': '小萌', 'number': '1001'}
>>> print('小萌的学号是:%(number)s' % ab)           #区别于字符串的格式化,字典的格式化中多了键名, %(键名)s
小萌的学号是:1001
>>> student={'小萌':'1001','小智':'1002','小强':'1005'}
>>> print('小强的学号是:%(小强)s' % student)
小强的学号是:1005
   由操作结果可以看出,字典的格式化方式是在每个转换说明符的%字符后加上用圆括号括起来的键名,再跟上其他说明元素。
   字典的格式化除了增加字符串键外,转换说明符还像以前一样工作。以这种方式使用字典时,只要所给出的键名在字典中可以找到,就可以获得任意数量的转换说明符。

字典和列表的区别

dict特点:
(1)查找和插入的速度极快,不会随着key的增加而变慢;
(2) 需要占用大量内存,内存浪费多。
list特点:
(1)查找和插入时间随着元素的增加而增加;
(2)占用空间小,浪费内存很少。
所以,dict是使用空间换取时间。
dict可以用在很多需要高速查找的地方,dict的键名必须是不可变对象。
dict内部存放的顺序和键放入的顺序没有关系。

字典方法

clear()方法

dict.clear()
此语法中,dict代表指定字典,该方法不需要参数。韩函数是一个原地操作函数(类似于list.sort()),没有任何返回值(返回值为none)。

>>> student={'小梦':'001','小智':'002','小强':'003','小张':'004'}
>>> student
{'小梦': '001', '小智': '002', '小强': '003', '小张': '004'}
>>> print("原始字典的元素个数为:%d" % len(student))
原始字典的元素个数为:4
>>> student.clear()
>>> print("clear后的字典元素个数为: %d" %  len(student))
clear后的字典元素个数为: 0

copy()方法

dict.copy()
该语法中dict代表指定字典,不需要参数,返回一个具有相同键值对的新字典。之歌方法是浅复制,因为值本身是相同的,而不是副本。

>>> st={'小梦': '001', 'info':[ 'man', '小强', '003'], '小张': '004'}
>>> st
{'小梦': '001', 'info': ['man', '小强', '003'], '小张': '004'}
>>> st1=st.copy()
>>> st1['小张']='005'                        #更改某个值,原始字典保持自己不变
>>> print("更改后的字典为:" ,st1)              
更改后的字典为: {'小梦': '001', 'info': ['man', '小强', '003'], '小张': '005'}
>>> print("原始字典sudent为:",st)
原始字典sudent为: {'小梦': '001', 'info': ['man', '小强', '003'], '小张': '004'}
>>> st1['info'].remove('man')               #改变某个值,原始字典跟随修改后的字典同样改变
>>> print("删除后st1为:",st1)
删除后st1为: {'小梦': '001', 'info': ['小强', '003'], '小张': '005'}
>>> print("删除后st为:",st)
删除后st为: {'小梦': '001', 'info': ['小强', '003'], '小张': '004'}

替换副本的值时原始字典不受影响。如果修改了某个值(原地修改不是替换),原始字典就会改变,因为同样的值也在原始字典中。以这种方式进行复制就是浅复制,而使用深复制(deep copy)就可以避免这种问题。

fromkeys()方法

dict.fromkeys(seq [,value])
此方法用于创建一个新的字典。
此语法中,dict表示指定字典,seq代表字典健名列表:value代表可选参数(键名对应的键值),设置键序列(seq)的值,该方法返回结果为列表。

>>> seq=('name','age','sex')
>>> info=dict.fromkeys(seq)
>>> print("新的字典为: %s" % info)
新的字典为: {'name': None, 'age': None, 'sex': None}
>>> info=dict.fromkeys(seq,10)
>>> print("新的字典为: %s" %info)
新的字典为: {'name': 10, 'age': 10, 'sex': 10}

get()方法

get()方法返回指定键的值,如果值不在字典中,就返回默认值。
语法如下:
dict.get(key,default=None)
dict代表指定字典,可以
代表字典中要查找的键名,default代表指定健名的键值不存在时返回的默认值。

>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> print("小梦的学号为:%s" % st.get())
Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    print("小梦的学号为:%s" % st.get())
TypeError: get expected at least 1 arguments, got 0
>>> print("小梦的学号为:%s" % st.get('小梦'))
小梦的学号为:001
>>> print("小锌的学号为:%s" % st.get('小锌'))
小锌的学号为:None
    print("小锌的学号为:%s" % st.get('小锌',default='小锌对应的学号不存在,没有小锌这位同学')) #get里面参数两个,健名和默认值,默认值直接跟逗号后面,不应该写default="",这样书写是错误的
TypeError: get() takes no keyword arguments
>>> print("小锌的学号为:%s" % st.get('小锌','小锌对应的学号不存在,没有小锌这位同学')) #默认值的正确写法
小锌的学号为:小锌对应的学号不存在,没有小锌这位同学
>>> 

key in dict()方法

小梦是否在字典st中?True
>>> print("小强是否在字典st中? %s" % ('小梦' in st))
小强是否在字典st中? True
>>> print("小强是否在字典st中?" % ('小强' in st))
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    print("小强是否在字典st中?" % ('小强' in st))
TypeError: not all arguments converted during string formatting
>>> print("小强是否在字典st中?%s" % ('小强' in st))
小强是否在字典st中?False

items()方法

以列表形式返回可遍历的(键/值)元组数组。
dict.items()

>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> st.items()
dict_items([('小梦', '001'), ('info', ['小强', '003']), ('小张', '004')])

keys()方法

返回一个字典的所有键名
dict.keys()

>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> st.keys()
dict_keys(['小梦', 'info', '小张'])

setdefault()方法

和get()方法类似,用于获得给定键相关联的值,default代表键不存在时设置的默认键值。该方法没有任何返回值。
dict.setdefault(key,default=None)

>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004', 1: 'a', 2: 'b'}
>>> st.setdefault(1)
'a'
>>> st.setdefault(1,'zhangsna')
'a'
>>> st.setdefault("info")
['小强', '003']
>>> st.setdefault("zhangsna","zhagnsna")
'zhagnsna'
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004', 1: 'a', 2: 'b', 'zhangsna': 'zhagnsna'}
//setdefault()方法如果键不存在则返回默认值,而原始的字典则会添加上该键和其默认值的值,改变了原始的字典。而get()方法则不改变原始的字典

update()方法

把dict2中的键值对更新到dict中。
dict.update(dict2)
该方法无返回值。

>>> new={1:'a',2:'b'}
>>> new
{1: 'a', 2: 'b'}
>>> st.update(new)
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004', 1: 'a', 2: 'b'}
>>> 

提供的字典中的项被添加到新的字典中,如果有相同的健名的项即可被覆盖。

values()方法

返回字典中所有的键值
用法:dict.values()

>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> st.keys()
dict_keys(['小梦', 'info', '小张'])
>>> st.values()
dict_values(['001', ['小强', '003'], '004'])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值