第二十六课:字典:各种内置方法

内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归小甲鱼官方所有。

练习题(来自小甲鱼官方论坛)

0. Python的字典是否支持一键(Key)多值(Value)?

答:不支持,对相同的键再次赋值会将上一次的值直接覆盖。

>>> dict1 = {1:'one', 1:'yi'}
>>> dict1[1]
'yi'
>>> 

1. 在字典中,如果试图为一个不存在的键(Key)赋值会怎样?

答:会自动创建对应的键(Key)并添加相应的值(Value)进去。

>>> dict2 = {1:'one', 2:'two', 3:'three'}
>>> dict2[4] = 'four'
>>> dict2
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> 

2. 成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以用来检查一个键(Key)是否存在字典中,那么请问哪种的检查效率更高些?为什么?

答:在字典中检查键(Key)是否存在比在序列中检查指定元素是否存在更高效。因为字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间复杂度是O(1),效率非常高。


3. Python对键(Key)和值(Value)有没有类型限制?

答:Python对键的要求相对要严格一些,要求它们必须是可哈希(Hash)的对象,不能是可变类型(包括变量、列表、字典本身等)。但是Python对值是没有任何限制的,它们可以是任意的Python对象。
如果不清楚哈希原理以及字典的存放原理的童鞋,推荐阅读下小甲鱼帮你整理的这篇文章:你知道Python的字典(Dict)是如何存储的吗?(http://bbs.fishc.com/thread-45016-1-1.html


4. 请目测下边代码执行后,字典dict1的内容是什么?

答:执行完成后,字典dict1的内容是:{1: '数字', 3: '数字'},这里要注意的是,fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。

>>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
>>> dict1.fromkeys((1, 3), '数字')
{1: '数字', 3: '数字'}
>>> 

5. 如果你需要将字典dict1 = {1: 'one', 2: 'two', 3: 'three'}拷贝到dict2,你应该怎么做?

答:可以利用字典的copy()方法:dict2 = dict1.copy(),在其他语言转移到Python小伙伴们刚开始可能会习惯性的直接用赋值的方法(dict2 = dict1),这样子做在Python中只是将对象的引用拷贝过去而已(如笔记中提到的例子)。

>>> a = {1:'one', 2:'two', 3:'three'}
>>> b = a.copy()
>>> c = a
>>> 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'}
>>> 

编程题

0. 尝试编写一个用户登录程序(这次尝试将功能封装成函数),程序实现如图:

登录.png

(图片转载自https://blog.csdn.net/junwei0206/article/details/44956195
答:

# -*- coding: UTF-8 -*- 
def load():
    dict1 = {'小甲鱼':'FishC'}
    while 1:
        key = input('''
|--- 新建用户:N/n ---|
|--- 登录帐号:E/e ---|
|--- 退出程序:Q/q ---|
|--- 请输入指令代码:''')
        if key == 'N' or key == 'n':
            temp_name = input('请输入用户名:')
            while temp_name in dict1:
                temp_name = input('此用户名已经被使用,请重新输入:')
 
            temp_password = input('请输入密码:')
            dict1[temp_name] = temp_password
            print('注册成功,赶紧试试登录吧^_^')
            continue
 
        elif key == 'E' or key == 'e':
            temp_name = input('请输入用户名:')
            while temp_name not in dict1:
                temp_name = input('您输入的用户名不存在,请重新输入:')
            temp_password = input('请输入密码:')
            while temp_password != dict1[temp_name]:
                temp_password = input('密码错误,请重新输入:')
            print('欢迎进入系统,请点右上角的X结束程序!')
            continue
 
        elif key == 'Q' or key == 'q':
            break
 
 
load()


1.请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

  • dict()是一个工厂函数,调用后会生成该类型的实例
>>> a = dict()
>>> type(a)
<class 'dict'>
  • 字典的一种内建方法:dict1.fromkeys(),用于创建并返回一个新的字典
>>> dict1 = {}
>>> dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None}
>>> dict2 = {}
>>> dict2.fromkeys((1,2,3),"Number")
{1: 'Number', 2: 'Number', 3: 'Number'}
>>> dict3 = {}
>>> dict3.fromkeys((1,2,3), ("one","two","three"))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
  • 访问字典的方法:
    1)dict1.keys() 返回键
    2) dict1.value() 返回值
    3)dict1.items() 返回键值对(也就是项)
    4)dict1.get() 对应键的值不存在的话返回一个None,这样程序就不会报错
    5)key in dict1 查找的是键,而不是值
    6)dict1.clear() 清空字典,不建议使用直接赋空值的方法:dict1 = {}
    7)dict1.copy():浅拷贝(见练习题5)
    8)dict1.pop():给定键弹出相应值
    9)dict1.popitem():给定键弹出相应项(包括键和值)
    10)dict1.setdefault():找不到给定键对应的值话会自动在字典中创建一个基于该键的项(区别于dict1.get()的结果)
    11)dict1.update():根据一个字典或映射关系去更新另一个字典
  • 收集参数时用**表示将参数们打包成字典的形式。之前介绍过以元组的形式组合,这一课介绍了以字典的形式打包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容