第二十六讲:字典:当索引不好用时2
一、知识点:
0.字典的一种内建方法:dict.fromkeys(s[,v])
>>> dict1 = {}
>>> dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None}
>>> dict1.fromkeys((1,2,3),'a')
{1: 'a', 2: 'a', 3: 'a'}
>>> dict1.fromkeys((1,2,3,),('a','b','c'))
{1: ('a', 'b', 'c'), 2: ('a', 'b', 'c'), 3: ('a', 'b', 'c')}
>>> dict1
{}
1.访问字典的方法:
1)dict.keys(),dict.values(),dict.items()(返回每一项)
>>> dict1 = dict1.fromkeys(range(10),'赞')
>>> dict1
{0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞', 9: '赞'}
>>> for eachkey in dict1.keys():
print(eachkey)
>>> for eachvalue in dict1.values():
print(eachvalue)
>>> for eachitem in dict1.items():
print(eachitem)
2)dict.get()。当查询的键不存在的话返回一个none,这样程序就不会报错。
3)key in dict。成员操作符查找的是键,不是值。
4)dict.clear()用于清空字典,不建议使用赋空值的方法。dict={}
>>> a = {1:'a'}
>>> b = a
>>> a.clear()
>>> b
{}
>>> a = {1:'a'}
>>> b = a
>>> a = {}
>>> b
{1: 'a'}
5)dict.copy():浅拷贝
>>> a = {1:'a'}
>>> b = a.copy()
>>> c = a
>>> c[2] = 'b'
>>> c
{1: 'a', 2: 'b'}
>>> a
{1: 'a', 2: 'b'}
>>> b
{1: 'a'}
6)dict.pop(key):给定键删除该键,并返回该键的值
7)dict.popitem():随机删除项(包括键和值),并返回该项的值
8)dict.setdefault(key):找得到对应键则返回对应键的值,找不到则创建一个基于该键的项
9)dict.update():根据一个字典或映射关系区更新另一个字典
>>> a
{1: 'a', 2: 'b', 3: None}
>>> b = {4:'d'}
>>> a.update(b)
>>> a
{1: 'a', 2: 'b', 3: None, 4: 'd'}
>>> c = {2:'f'}
>>> a.update(c)
>>> a
{1: 'a', 2: 'f', 3: None, 4: 'd'}
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------
二、课后作业
0.python的字典是否支持一键(key)多值(value)?
答:不支持。
1.在字典中,如果试图为一个不存在的键赋值会怎么样?
答:会自动创建对应的键并赋相应的值。
2.成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以检查一个键是否存在字典中,那么请问哪种检查效率比较高?为什么?
答:在字典中检查键是否存在比在序列中检查元素是否存在更高效。因为字典的原理采用的哈希算法存储,不需要采用查找算法进行匹配,因此时间复杂度是O(1),效率非常高。
3.python对键(key)和值(value)有没有类型限制?
答:python对键的要求比较严格,要求它们是可哈希(Hash)对象,不能是可变类型(包括变量、列表、字典本身等)。但是python对值是没有限制的,它们可以是任何的python对象。
4.请目测以下代码中执行后,字典dict1的内容是什么?
>>> dict1.fromkeys((1,2,3),('one','two','three'))
>>> dict1.fromkeys((1,3),'数字')
答:执行代码后,字典dict1的内容是{1:'数字',3:'数字'}。
5.你如果需要需要将dict1={1:'one',2:'two',3:'three'}拷贝到dict2,你应该怎么做?
答:dict2 = dict1.copy()
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------
三、动动手
0.尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如图:
def load():
dict1 = {}
while 1:
print('----------------------------')
print('新建用户:N/n')
print('登录账号:E/e')
print('推出程序:Q/q')
key = input('请输入指令代码:')
if key == 'N' or key == 'n':
user = input('请输入用户名:')
while user in dict1:
user = input('此用户名已经被使用,请重新输入:')
passwd = input('请输入密码:')
dict1[user] = passwd
print('注册成功,赶紧试试登录吧!')
continue
elif key == 'E' or key=='e':
user = input('请输入用户名:')
while user not in dict1:
user = input('用户名不存在,请重新输入:')
passwd = input('请输入密码:')
while passwd != dict1[user]:
passwd = input('密码错误,请重新输入:')
print('欢迎进入系统!')
break
elif key == 'Q' or key=='q':
break
load()
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------