知识点

删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

显示删除一个字典用del命令,如下:

>>> dict1 = {'a':1,'b':2,'c':3}
>>> del dict1['a'] >>> dict1
{'b': 2, 'c': 3}
>>> del dict1 >>> dict1
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
dict1
NameError: name 'dict1' is not defined

字典key的特性

字典value可以是任何的python对象,既可以是标准的对象,也可以是用户定义的,但key不行。

两个重要的店需要记住:

1) 不允许同一个key出现两次。创建时如果同一个key被赋值两次,后一个value会被记住,如下:

>>> dict1 = {'a':1,'b':2,'c':3,'a':4}
>>> dict1['a']
4

2) key必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行,如下:

>>> dict2 = {['a']:1,'b':2}
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
dict2 = {['a']:1,'b':2}
TypeError: unhashable type: 'list' #改成元祖形式
>>> dict2 = {('a','c'):1,'b':2}
>>> dict2
{('a', 'c'): 1, 'b': 2}
>>> dict2['a','c']
1

字典的内置方法:

clear():清除字典内元素

示例:

>>> dict1
{'a': 4, 'b': 2, 'c': 3}
>>> dict1.clear()
>>> dict1
{}

copy():返回一个字典的浅拷贝

示例:

>>> a = {1:'one',2:'two',3:'three'}
>>> b = a.copy()
>>> b
{1: 'one', 2: 'two', 3: 'three'}

直接赋值和copy的区别

>>> dict1 = {'a':1,'b':2,'c':[1,2,3]}
>>> dict2 = dict1 #浅拷贝: 引用对象
>>> dict3 = dict1.copy() #浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用 #修改数据:
>>> dict1['a'] = '一'
>>> dict1['c'].remove(1) #输出结果对比:
>>> dict1
{'a': '一', 'b': 2, 'c': [2, 3]}
>>> dict2
{'a': '一', 'b': 2, 'c': [2, 3]}
>>> dict3
{'a': 1, 'b': 2, 'c': [2, 3]}

示例中 dict2其实是dict1的引用(别名),所以输出结果都是一致的。

dict3父对象进行了深拷贝,不会随dict1修改而修改,子对象是浅拷贝所以随dict1的修改而修改

fromkeys()创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

示例:

#语法
dict.fromkeys(seq[, value]) #参数
seq -- 字典键值列表。
value -- 可选参数, 设置键序列(seq)的值,默认为None #示例:
>>> dict1 = {}
>>> dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None} >>> dict1.fromkeys((1,2,3),'Number')
{1: 'Number', 2: 'Number', 3: 'Number'} >>> 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: '数字'}

get(key, default=None)返回指定键的值,如果key不存在,可以返回None,或者指定的value

示例:

>>> dict1
{'a': '一', 'b': 2, 'c': [2, 3]} >>> dict1.get('a')
'一' >>> print(dict1.get('d'))
None >>> print(dict1.get('d','四'))

key in dict如果键在字典dict里返回true,否则返回false

示例:

>>> dict1
{'a': '一', 'b': 2, 'c': [2, 3]}
>>> 'a' in dict1
True
>>> 'd' in dict1
False

keys()以列表返回一个字典所有的键

示例

>>> dict1
{'a': '一', 'b': 2, 'c': [2, 3]} >>> dict1.keys()
dict_keys(['a', 'b', 'c'])

values()以列表返回字典中的所有值

示例:

>>> dict1.values()
dict_values(['一', 2, [2, 3]])

items()以列表返回可遍历的(键, 值) 元组数组

示例:

>>> dict1.items()
dict_items([('a', '一'), ('b', 2), ('c', [2, 3])])

setdefault(key, default=None)和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default

示例:

>>> a
{1: 'one', 2: 'two', 3: 'three'} >>> a.setdefault(1)
'one' >>> a.setdefault('小白')
>>> a
{1: 'one', 2: 'two', 3: 'three', '小白': None} >>> a.setdefault(5,'five')
'five'
>>> a
{1: 'one', 2: 'two', 3: 'three', '小白': None, 5: 'five'}

update(dict2)把字典dict2的键/值对更新到dict1里

示例:

#参数
dict2 -- 添加到指定字典dict1里的字典。 >>> dict1
{'a': '一', 'b': 2, 'c': [2, 3]} >>> dict2 ={'c':[1,2,3,4]} >>> dict1.update(dict2) >>> dict1
{'a': '一', 'b': 2, 'c': [1, 2, 3, 4]} >>> dict3 = {'d':5678} >>> dict1.update(dict3) >>> dict1
{'a': '一', 'b': 2, 'c': [1, 2, 3, 4], 'd': 5678}

pop(key[,default])删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。

示例:

>>> a = {1: 'one', 2: 'two', 3: 'three', 4: 'Four'}

>>> a.pop(2)
'two' >>> a
{1: 'one', 3: 'three', 4: 'Four'} >>> a.pop()
Traceback (most recent call last):
File "<pyshell#44>", line 1, in <module>
a.pop()
TypeError: pop expected at least 1 arguments, got 0 >>> a.pop(2)
Traceback (most recent call last):
File "<pyshell#80>", line 1, in <module>
a.pop(2)
KeyError: 2 >>> a.pop(5,'f')
'f' >>> a
{1: 'one', 3: 'three', 4: 'Four'} >>> a.pop(4,'f')
'Four' >>> a
{1: 'one', 3: 'three'}

popitem()随机返回并删除字典中的一对键和值(一般删除末尾对)。

示例:

>>> a
{1: 'one', 3: 'three', 4: 'Four'}
>>> a.popitem()
(4, 'Four')
>>> a
{1: 'one', 3: 'three'} >>> a = {}
>>> a.popitem()
Traceback (most recent call last):
File "<pyshell#85>", line 1, in <module>
a.popitem()
KeyError: 'popitem(): dictionary is empty'

课后习题

测试题

  • Python的字典是否支持一键(key)多值(value)?
不支持,对相同的键再次赋值会将上一次的值直接覆盖。

>>> dict1 = {1:'one', 1:'yi'}
>>> dict1[1]
'yi'
  • 在字典中,如果试图为一个不存在的键(key)赋值会怎么样?

会自动创建对应的键(key)并添加相应的值(value)进去

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

    在字典中检查键(key)是否存在比在序列中检查是否存在更高效。

    因为字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间复杂度是0(1),效率非常高。

  • Python对键(key)和值(value)有没有类型限制?

    Python对键(key)的要求相对严格一些,要求它们必须是可哈希的对象,不能是可变类型(包括变量、列表、字典本身等。)

    但是Python对值是没有任何限制的,它们可以是任意的Python对象。

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

>>> dict1.fromkeys((1, 2, 3), ('one', 'two', 'three'))
>>> dict1.fromkeys((1, 3), '数字') 执行完成后,字典dict1的内容是:{1:'数字',2:'数字'}
【注意】:fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的把整个字典给覆盖掉。
  • 如果你需要将字典dict1 = {1:'one',2:'two',3:'three'}拷贝到dict2,你应该这么做?
可以利用copy()方法
dict2 = dict1.copy()
用赋值的方法(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'}

动动手

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


user_data = {} def new_user():
prompt = '请输入用户名:'
while True:
name = input(prompt)
if name in user_data:
prompt = '此用户名已经被使用,请重新输入:'
continue
else:
break passwd = input('请输入密码:')
user_data[name] = passwd
print('注册成功,赶紧试试登录吧^_^') def old_user():
prompt = '请输入用户名:'
while True:
name = input(prompt)
if name not in user_data:
prompt = '您输入的用户名不存在,请重新输入:'
continue
else:
break passwd = input('请输入密码:')
pwd = user_data.get(name)
if passwd == pwd:
print('欢迎进入XXOO系统,请点右上角的X结束程序!')
else:
print('密码错误!') def showmenu():
prompt = '''
|--- 新建用户:N/n ---|
|--- 登录账号:E/e ---|
|--- 推出程序:Q/q ---|
|--- 请输入指令代码:''' while True:
chosen = False
while not chosen:
choice = input(prompt)
if choice not in 'NnEeQq':
print('您输入的指令代码错误,请重新输入:')
else:
chosen = True if choice == 'q' or choice == 'Q':
break
if choice == 'n' or choice == 'N':
new_user()
if choice == 'e' or choice == 'E':
old_user() showmenu()

零基础入门学习Python(26)--字典:当索引不好用时2的更多相关文章

  1. 【Python教程】《零基础入门学习Python》(小甲鱼)

    [Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609

  2. 《零基础入门学习Python》【第一版】视频课后答案第001讲

    测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...

  3. 零基础入门学习Python(1)--我和Python的第一次亲密接触

    前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...

  4. 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...

  5. 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...

  6. 零基础入门学习Python(36)--类和对象:给大家介绍对象

    知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...

  7. 零基础入门学习Python(17)--函数:Python的乐高积木

    前言 相信大家小时候都玩过神奇的乐高积木, 只要通过想象力和创造力我们可以拼凑很多神奇的东西,那么随着我们学习的深入,我们编写的Python代码也将日益增加,并且也越来越复杂, 所以呢,我们需要找寻一 ...

  8. 零基础入门学习Python(25)--字典:当索引不好用时

    知识点 字典属于映射类型. 列表,元祖,字符串等属于序列类型 创建及访问字典 #创建一个字典 >>> dict1 = {'李宁':'一切皆有可能','耐克':'Just do it' ...

  9. 零基础入门学习Python(35)--图形用户界面入门:EasyGui

    知识点 EasyGui学习文档[超详细中文版] 1. 建议不要在IDLE上运行EasyGui EasyGui是运行在TKinter上并拥有自身的事件循环,而IDLE也是Tkinter写的一个应用程序并 ...

随机推荐

  1. idea 设置项目编码

    目前我了解的设置idea编码有两种形式(但深层次不太了解) 方式一: 这个方式需要你点击要设置编码单个文件,选择编码.一次只能修改一个文件编码 方式二: 一般工作时使用这个方式,文件编码,选择项目文件 ...

  2. 用jdbc连接数据库并简单执行SQL语句

    一:版本一.这种存在一个问题就是每执行一次操作都会创建一次Connection链接和且释放一次链接 1:创建pojo对象(OR映射,一个pojo类对应一张数据库表)   package com.yin ...

  3. jQuery查找

    导航查找方法: 向下查找兄弟标签: $().next() $().nextAll() 向上查找兄弟标签: 可以查找所有兄弟标签: 查找子标签 查找父级标签: $().parent() $().pare ...

  4. ACM复习专项

    资料整理 ACM训练营 邝斌的ACM模板 牛客网哈理工ACM教学视频 视频网盘资料(密码:kntr) 1. 训练阶段 第一阶段:练习经典常用算法 (本周任务) 1. 最短路(Floyd.Dijstra ...

  5. BFS(最短路) HDOJ 4308 Saving Princess claire_

    题目传送门 题意:一个(r*c<=5000)的迷宫,起点'Y‘,终点'C',陷阱‘#’,可行路‘*’(每走一个,*cost),传送门P,问Y到C的最短路 分析:一道最短路问题,加了传送门的功能, ...

  6. 题解报告:hdu 1570 A C

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1570 Problem Description Are you excited when you see ...

  7. 大小写 unix and windows

    如果你没有使用工具, 只是sqlplus对大小写不敏感. 如果你要给sql传递参数,且在windows下面就不需要考虑.如果是aix系统,最好写一样.

  8. 8.JAVA-向上转型、向下转型

    父子对象之间的转换分为了向上转型和向下转型,它们区别如下: 向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换 向下转型 : 通过父类对象(大范围)实例化子类对象(小范围) ...

  9. SQL快速备份

    ALTER  PROCEDURE [dbo].[usp_Backup_DataBase]    (      @BackupDataBaseName VARCHAR(128)    )AS    BE ...

  10. IOS 中使用token机制来验证用户的安全性

    登录的业务逻辑{    http:是短连接.         服务器如何判断当前用户是否登录?    // 1. 如果是即时通信类:长连接.    // 如何保证服务器跟客户端保持长连接状态? // ...