1:fromkeys(...)创建并返回一个新的字典,第一个参数是键,第二个参数是值
dict()是一个工厂函数,调用后会产生该类型的实例
2:dict.fromkeys(S[,v])
New dict with keys from s and values equal to v(v defaults to None)
>>> dict1=dict1.fromkeys(range(32),'赞')
>>> 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: '赞'}:
3:访问字典的方法:、
1):(1)访问字典的键
>>> for eachkey in dict1.keys():print(eachkey)
0
;
31
(2)访问字典的值
>>> for eachvalue in dict1.values():print(eachvalue)
赞
;
赞
(3)访问字典的每一项
>>> for eachItem in dict1.items():print(eachItem)
(0, '赞')
;
(31, '赞')
打印字典里的值
>>> print(dict1.get(32))
None
>>> print(dict1.get(31))
赞
key in dict1:查找的是键,而不是值
>>> 31 in dict1
True
>>> 32 in dict1
False
清空字典用dict1.clear()
>>> a={'姓名':'小甲鱼'}
>>> b=a
>>> b
{'姓名': '小甲鱼'}
>>> a={}
>>> a
{}
>>> b
{'姓名': '小甲鱼'}
>>> a=b
>>> a
{'姓名': '小甲鱼'}
>>> a.clear()
>>> a
{}
>>> b
浅拷贝跟赋值不同:浅拷贝是另外备份了一份,赋值只是为同一个东西贴了不同的标签
>>> a
{1: 'one', 2: 'two', 3: 'three'}
>>> b=a.copy()
>>> b
{1: 'one', 2: 'two', 3: 'three'}
>>> id(a)
52926856
>>> id(b)
52959944
>>> id(c)
52926856
>>> c[4]='four'
>>> c
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> b
{1: 'one', 2: 'two', 3: 'three'}
字典里弹出dict1.pop():给定键弹出相应值
>>> a.pop(2)
'two'
>>> a
{1: 'one', 3: 'three', 4: 'four'}
dict1.popitem():给定键弹出相应项(包括键和值)
>>> a.popitem()找不到给定键对应的值话会自动在字典中创建一个基于该键的项(区别于dict1.get()的结 果)(1, 'one')
>>> a
{3: 'three', 4: 'four'}
dict1.setdefalut()
>>> a.setdefault('小白')>>> a
{'小白': None, 3: 'three', 4: 'four'}
>>> a.setdefault(5,'five')
'five'
>>> a
{'小白': None, 3: 'three', 4: 'four', 5: 'five'}
update根据一个字典或映射关系去更新字典里的值
>>> b={'小白':'狗'}
>>> a.update(b)
>>> a
{'小白': '狗', 3: 'three', 4: 'four', 5: 'five'}
课后练习:
Python的字典是否支持一键(Key)多值(Value)?
答:不支持,对相同的键再次赋值会将上一次的值直接覆盖。
在字典中,如果试图为一个不存在的键(Key)赋值会怎样?
答:会自动创建对应的键(Key)并添加相应的值(Value)进去。
成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以用来检查一个键(Key)是否存在字典中,那么请问哪种的检查效率更高些?为什么?
答:在字典中检查键(Key)是否存在比在序列中检查指定元素是否存在更高效。因为字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间复杂度是O(1),效率非常高。
Python对键(Key)和值(Value)有没有类型限制?
答:Python对键的要求相对要严格一些,要求它们必须是可哈希(Hash)的对象,不能是可变类型(包括变量、列
表、字典本身等)。
但是Python对值是没有任何限制的,它们可以是任意的Python对象。
如果不清楚哈希原理以及字典的存放原理的童鞋,推荐阅读下小甲鱼帮你整理的这篇文章:你知道Python的字典
请目测下边代码执行后,字典dict1的内容是什么?
>>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
>>> dict1.fromkeys((1, 3), '数字')
- 1
- 2
答:执行完成后,字典dict1的内容是:{1: ‘数字’, 3: ‘数字’}
这里要注意的是,fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。
如果你需要将字典dict1 = {1: ‘one’, 2: ‘two’, 3: ‘three’}拷贝到dict2,你应该怎么做?
答:可以利用字典的copy()方法:dict2 = dict1.copy(),在其他语言转移到Python小伙伴们刚开始可能会习惯性的直接用赋值的方法(dict2 = dict1),这样子做在Python中只是将对象的引用拷贝过去而已(如笔记中提到的例子)。
def load():
dict1={'小甲鱼':'FichC'}while 1:
print('|---新建用户:N/n---|')
print('|---登录账户:E/e---|')
print('|---退出程序:Q/q---|')
n=input('|---请输入指令:')
if n=='N'or n=='n':
name=input('请输入用户名:')
if name in dict1:
name=input('此用户名已经被占用,请重新输入:')
pw=input('请输入密码:')
dict1[name]=pw
print('注册成功,赶紧试试登录吧')
continue
elif n=='E'or n=='e':
name=input('请输入用户名:')
while name not in dict1:
name=input('您输入的用户名不存在,请重新输入:')
pw=input('请输入密码:')
while pw not in dict1[name]:
pw=input('密码错误,请重新输入:')
print('欢迎进入XXOO系统,请点击右上角的X结束程序!')
continue
elif n=='Q'or n=='q':
print('欢迎使用,谢谢!')
break
load()