python-26-字典:当索引不好用时2

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的字典 

(Dict)是如何存储的吗?( http://bbs.fishc.com/thread-45016-1-1.html

请目测下边代码执行后,字典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()    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值