字典
映射:
dict={key:value}
操作符:
-
fromkeys (iterable, value=None, /) from builtins.type Returns a new dict with keys from iterable and values equal to value. >>> dict1.fromkeys((1,2,3)) {1: None, 2: None, 3: None} >>> dict1.fromkeys((1,2,3),'number') {1: 'number', 2: 'number', 3: 'number'}
-
keys()
>>> for eachkey in dict1.keys(): print(eachkey)#打印每个key的值
-
values()
>>> for eachvalue in dict1.values(): print(eachvalue)#打印每个value的值
-
items()
for eachItem in dict.items(): print(eachItem)#打印每个字典映射组
-
get()
>>> dict1.get(32,'木有') '木有' >>> dict1.get(31) '赞'
-
成员资格操作符in/not in
>>> dict1 {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞', 9: '赞', 10: '赞', 11: '赞', 12: '赞', 13: '赞', 14: '赞', 15: '赞', 16: '赞', 17: '赞', 18: '赞', 19: '赞', 20: '赞', 21: '赞', 22: '赞', 23: '赞', 24: '赞', 25: '赞', 26: '赞', 27: '赞', 28: '赞', 29: '赞', 30: '赞', 31: '赞'} >>> 32 in dict1 False >>> 31 in dict1 True
-
clear
>>> dict1.clear() >>> dict1 {}
-
copy()
>>> a = {1:'one',2:'two',3:'three'} >>> b = a.copy() #前拷贝,后续操作无关 >>> c = a >>> c[4] = 'four' >>> c {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> b {1: 'one', 2: 'two', 3: 'three'} >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
-
pop()/popitem()
>>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> a.pop(2)#甩出后,就不再存储于字典中 'two' >>> a.popitem() (4, 'four') >>> a.popitem() (3, 'three') >>> a.popitem(2) Traceback (most recent call last): File "<pyshell#66>", line 1, in <module> a.popitem(2) TypeError: popitem() takes no arguments (1 given)
-
setdefault
>>> b.setdefault('小白') #输入一个默认item >>> b {1: 'one', 2: 'two', 3: 'three', '小白': None} >>> b.setdefault(4,'four') 'four' >>> b {1: 'one', 2: 'two', 3: 'three', '小白': None, 4: 'four'} >>> b.setdefault('猪婆') >>> b {1: 'one', 2: 'two', 3: 'three', '小白': None, 4: 'four', '猪婆': None}
-
update
>>> c ={'小白':'狗'} >>> b {1: 'one', 2: 'two', 3: 'three', '小白': None, 4: 'four', '猪婆': None} >>> b.update(c) >>> b {1: 'one', 2: 'two', 3: 'three', '小白': '狗', 4: 'four', '猪婆': None}
第25课课后作业
-
尝试将数据(‘F’:70,’C’:67,’h’:104,’i’:105,’s’:115)创建为一个字典并访问键‘C’对应的值。
>>> lis = (('F',70),('C',67),('h',104),('i',105),('s',115)) >>> dic = dict(lis) >>> dic {'F': 70, 'C': 67, 'h': 104, 'i': 105, 's': 115} >>> dic['C'] 67
-
用
[]
括起来的数据我们叫列表,那么用{}
括起来的数据就叫字典,对吗?不对。下图所示,没有映射的数据不是字典,而叫set集合。
>>> notadict = {1,2,3,4,5} >>> type(notadict) <class 'set'>
-
如何理解有些东西字典做得到,但“万能的”列表却难以实现?
>>> brand = ['李宁','耐克','阿迪达斯'] >>> slogan = ['一切皆有可能','just do it','阿迪达斯'] >>> print('李宁口号是:', slogan[brand.index('李宁')]) 李宁口号是: 一切皆有可能 >>> dict ={brand[1]:slogan[1]} >>> dict {'耐克': 'just do it'}
-
下面这些代码,它们执行一样的操作吗?你看得出差别吗?
>>> c = dict(zip(['one','two','three'],[1,2,3])) >>> c {'one': 1, 'two': 2, 'three': 3} >>> a = dict(one=1,two=2, three=3) >>> a {'one': 1, 'two': 2, 'three': 3} >>> b = {'one':1,'two':2,'three':3} >>> b {'one': 1, 'two': 2, 'three': 3} >>> d = dict([('two',2),('one',1),('three',3)]) >>> d {'two': 2, 'one': 1, 'three': 3} >>> e = dict({'three':3,'one':1,'two':2}) >>> e {'three': 3, 'one': 1, 'two': 2}
是的,他们都在创建字典,如上图所示。
-
如图,你可推测出打了马赛克部分的代码吗?
data = "1000,小甲鱼,男" MyDict = {} (MyDict['id'],MyDict['name'],MyDict['sex']) = ("1000","小甲鱼","男") print("ID: " + MyDict['id']) print("Name: " + MyDict['name']) print("Sex "+ MyDict['sex'])
print('|---欢迎进入通讯录程序---|')
print('|---1:查询联系人资料---|')
print('|---2:插入新的联系人---|')
print('|---3:删除已有联系人---|')
print('|---4:退出通讯录程序---|')
contacts = dict({"李亚星":185806930, "周阳":199718154})
while 1:
instr = int(input('\n请输入指令代码:'))
if instr == 1:
name = input('请输入联系人姓名:')
if name in contacts:
print (name + ':' ,contacts[name])
else:
print('您输入的姓名不在通讯录中')
if instr == 2:
name = input('请输入新的联系人姓名:')
if name in contacts:
print ('您输入的姓名已存在')
print (name + ':' ,contacts(name))
else:
num = input('请输入联系人号码:')
contacts.update({name : num})
if instr == 3:
name = input('请输入需要删除的联系人:')
if name not in contacts:
print ('您输入的姓名不存在')
else:
contacts.pop(name)
if instr == 4:
print('感谢您的查询,再见')
break
第26课课后作业
-
Python的字典是否支持一键(Key)多值(Value)?
不支持,对相同的键再次赋值会讲上次的值直接覆盖。
>>> dic1 = {1:'one', 1:'yi'} >>> dic1[1] 'yi'
-
在字典中,如果试图为一个不存在的键(Key)赋值会怎么样?
>>> dic1 = {1:'one', 2:'two'} >>> dic1[3] Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> dic1[3] KeyError: 3 >>> dic1[3] = 'three' #自动创建对应的Key和对应的Value >>> dic1 {1: 'one', 2: 'two', 3: 'three'}
-
成员资格操作符(in和not in)可以检查一个元素是否存在在序列中,当然也可以用来检验一个键(Key)是否存在字典中,那么哪种检查效率更高些呢?为什么?
在字典中检查Key效率更高,因为字典的原理是使用哈希算法存储,一步到位,不用使用查找算法进行匹配。
-
Python对键(Key)和值(Value)有没有类型限制?
Python对键的要求严格一些,必须是可哈希的对象,不能死可变类型(变量,列表,字典本身)。
但是对值没有任何限制,可以使任意的python对象。
参考:https://fishc.com.cn/forum.php?mod=viewthread&tid=45016&extra=page%3D1&page=1
-
目测以下代码执行后,字典dict1的内容是什么?
>>> dic1.fromkeys((1,2,3),('one','two','three')) {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')} >>> dic1.fromkeys((1,3),'数字') {1: '数字', 3: '数字'} >>> dic1 {1: 'one', 2: 'two', 3: 'three'}
注意:fromkeys方法是直接创建新的字典,不会把整个字典覆盖掉。
-
如果你需要将字典dict1 = {1:’one’, 2:’two’, 3:’three’}拷贝到dict2,你应该怎么做?
利用copy()方法
dict2=dict1.copy(),直接赋值方法(
dict2 =dict1)只是将对象引用拷贝过去而已。如图所示:
>>> a = {1:'one',2:'two',3:'three'} >>> b = a.copy() #前拷贝,后续操作无关 >>> c = a >>> c[4] = 'four' >>> c {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> b {1: 'one', 2: 'two', 3: 'three'} >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
-
尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如下图:
print('|---新建用户:N/n---|') print('|---登录账号:E/e---|') print('|---退出程序:Q/q---|') while True: choice = input('|---请输入指令代码:') pro = dict({'李亚星':123, '周阳':778}) if choice == 'N' or choice == 'n': prompt = '请输入用户名:' while True: key = input(prompt) if key in pro: prompt = '此用户名已经被使用,请重新输入:' continue else: break value = input('请输入密码:') pro[key] = value print('注册成功,赶紧登录吧') if choice == 'E' or choice == 'e': prompt = '请输入用户名:' while True: key = input(prompt) if key not in pro: prompt = '此用户名不存在,请重新输入:' continue else: break value = input('请输入密码:') pd = pro.get(key) if value == pd: print('欢迎进入我的世界!') else: print('密码错误') continue if choice == 'Q' or choice == 'q': print('再见')