本章主题
映射类型: 字典操作符
内建函数
内建方法
字典的键
集合类型
操作符
内建函数
内建方法
相关模块

一个字典对象是可变的,它是一个容器类型,能存储任意个数的 Python 对象,其中也包括其他容器 类型。

哈希表的算法是获取键,对键执行一个叫做哈希函数的操作, 并根据计算的结果,选择在数据结构的某个地址中来存储你的值。任何一个值存储的地址皆取决于 它的键。正因为这种随意性,哈希表中的值是没有顺序的。

keys()方法,返回一个列表,包含字典中所有的 键;values()方法,返回一个列表,包含字典中所有的值;items(), 返回一个包含所有(键, 值)元 组的列表。这些方法在不按任何顺序遍历字典的键或值时很有用。

创建字典-------可以用工厂方法 dict()

创建字典-------内建方法 fromkeys() 来创建一个"默认"字典, 字 典中元素具有相同的值 (如果没有给出, 默认为 None)

>>> ddict={}.fromkeys(('x','y'),-1)

>>> ddict

{'y': -1, 'x': -1}

>>> edict={}.fromkeys(('hello','python'))

>>> edict

{'python': None, 'hello': None}

检查一个字典中是否有某个键-------用字典的 has_key()方法,或它的替代方法 in  、 not in 操作符

字典中混用数字和字符串---逐一赋值

字典的整体赋值 >>> dict3 = {3.2: 'xyz', 1: 'abc', '1': 3.14159}

字典中的键必须是可哈希的(可哈希的?--是指可重新生成新地址), 所以数字和字符串可以作为字典中的键, 但是列表和其他字典不行。

在字典中使用字符串格式符( %)的方法

⚠️请不要用 dict, list, file, bool, str, input, len 这样的内建类型为变量命名。

生成字典举例----

>>> dict(zip(('x','y'),(1,2)))

{'y': 2, 'x': 1}

>>> dict([('xyz'[i-1], i) for i in range(1,4)])

{'y': 2, 'x': 1, 'z': 3}

>>> dict(x=1, y=2)

{'y': 2, 'x': 1}

内建函数 hash()本身并不是为字典设计的方法,但它可以判断某个对象是否可以做一个字典的 键。将一个对象作为参数传递给 hash(), 会返回这个对象的哈希值.

[id(x) for x in newPerson]

sorted()的内建函数,它返回 一个有序的迭代子:

    >>> for eachKey in sorted(dict2):... print 'dict2 key', eachKey, 'has value',dict2[eachKey]

更新字典--update()方法可以用来将一个字典的内容添加到另外一个字典中.clear()方法可以用来删除字典中的所有的条目.

get()方法查找键,不必担心因键不存在而引发异常。

更新字典---字典增加键值对------setdefault() 检查字典 中是否含有某键。 如果字典中这个键存在,你可以取到它的值。 如果所找的键在字典中不存在, 你可以给这个键赋默认值并返回此值.

fromkeys()
{}.fromkeys(('love', 'honor'), True)

字典中的值没有任何限制。 他们可以是任意 Python 对象.但是字典中的键是有类型限制的.所有不可变的类型都是可哈希的,因此它们都可以做为字典的键.

创建集合类型和给集合赋值--这也是集合被创建的唯一方法 - 用集合的工厂方法可变集合 set() 和不可变集合 frozenset()

(列表和字典可以分别用他们自 己的工厂方法 list() 和 dict() 创建)

访问集合中的值--

>>> 'k' in s
False

更新集合--

add(), remove(), discard(), pop(), clear(). 这些接受对象的方法,参数必 须是可哈希的----set()创建的可变集合。

======练习(待后续补做)========

7.12 练习

7–1. 字典方法。哪个字典方法可以用来把两个字典合并到一起?

7–2. 字典的键。我们知道字典的值可以是任意的 Python 对象,那字典的键又如何呢?请试 着将除数字和字符串以外的其他不同类型的对象作为字典的键,看一看,哪些类型可以,哪些不行? 对那些不能作字典的键的对象类型,你认为是什么原因呢?

7–3. 字典和列表的方法。
(a) 创建一个字典,并把这个字典中的键按照字母顺序显示出来。
(b) 现在根据已按照字母顺序排序好的键,显示出这个字典中的键和值。 (c)同(b),但这次是根据已按照字母顺序排序好的字典的值,显示出这个字典中的键和值。(注

意:对字典和哈希表来说,这样做一般没有什么实际意义,因为大多数访问和排序(如果需要)都是 基于字典的键,这里只把它作为一个练习。)

7-4. 建立字典。给定两个长度相同的列表,比如说,列表[1, 2, 3,...]和['abc', 'def', 'ghi',...],用这两个列表里的所有数据组成一个字典,像这样:{1:'abc', 2: 'def', 3: 'ghi',...}

Edit By Vheavens

Edit By Vheavens

7–5. userpw2.py. 下面的问题和例题 7.1 中管理名字-密码的键值对数据的程序有关。

(a)修改那个脚本,使它能记录用户上次的登录日期和时间(用 time 模块),并与用户密码一起 保存起来。程序的界面有要求用户输入用户名和密码的提示。无论户名是否成功登录,都应有提示, 在户名成功登录后,应更新相应用户的上次登录时间戳。如果本次登录与上次登录在时间上相差不 超过 4 个小时,则通知该用户: “You already logged in at: <last_ login_timestamp>.”

(b) 添加一个“管理”菜单,其中有以下两项:(1)删除一个用户 (2)显示系统中所有用户的名 字和他们的密码的清单。

(c) 口令目前没有加密。请添加一段对口令加密的代码(请参考 crypt, rotor, 或其它加密模块) (d) 为程序添加图形界面,例如,用 Tkinter 写。
(e) 要求用户名不区分大小写。
(f) 加强对用户名的限制,不允许符号和空白符。 (g)合并“新用户”和“老用户”两个选项。如果一个新用户试图用一个不存在的用户名登录,

询问该用户是否是新用户,如果回答是肯定的,就创建该帐户。否则,按照老用户的方式登录。

7-6. 列表和字典。创建一个简单的股票证券投资数据系统。其中应至少包含四项数据:股市 行情显示器符号,所持有的股票,购买价格及当前价位 - 你可以随意添加其他数据项,比如收益率, 52 周最高指数、最低指数,等等。

用户每次输入各列的数据构成一个输出行。每行数据构成一个列表。还有一个总列表,包括了 所有行的数据。数据输入完毕后,提示用户选择一列数据项进行排序。把该数据项抽取出来作为字 典的键,字典的值就是该键对应行的值的列表。提醒读者:被选择用来排序的数据项必须是非重复 的键,否则就会丢失数据,因为字典不允许一个键有多个值。

    你还可以选择其他计算输出,比如,盈亏比率,目前证券资产价值等。

7-7. 颠倒字典中的键和值。用一个字典做输入,输出另一个字典,用前者的键做值,前者的 值做键。

7-8. 人力资源。创建一个简单的雇员姓名和编号的程序。让用户输入一组雇员姓名和编号。 你的程序可以提供按照姓名排序输出的功能,雇员姓名显示在前面,后面是对应的雇员编号。附加 题:添加一项功能,按照雇员编号的顺序输出数据。

7-9. 翻译

(a) 编写一个字符翻译程序(功能类似于 Unix 中的 tr 命令)。我们将这个函数叫做 tr(),它有 三个字符串做参数: 源字符串、目的字符串、基本字符串,语法定义如下:

    def tr(srcstr, dststr, string)

srcstr 的内容是你打算“翻译”的字符集合,dsrstr 是翻译后得到的字符集合,而 string 是 你打算进行翻译操作的字符串。举例来说,如果 srcstr == 'abc', dststr == 'mno', string == 'abcdef', 那么 tr()的输出将是'mnodef'. 注意这里 len(srcstr) == len(dststr).

在这个练习里,你可以使用内建函数 chr() 和 ord(), 但它们并不一定是解决这个问题所必不 可少的函数。

(b) 在这个函数里增加一个标志符参数,来处理不区分大小写的翻译问题。

Edit By Vheavens

Edit By Vheavens

(c)修改你的程序,使它能够处理删除字符的操作。字符串 srcstr 中不能够映射到字符串 dststr 中字符的多余字符都将被过滤掉。换句话说,这些字符没有映射到 dststr 字符串中的任何字符,因 此就从函数返回的字符里被过滤掉了。举例来说:如果 srcstr == 'abcdef', dststr == 'mno', string == 'abcdefghi', 那么 tr()将输出'mnoghi'. 注意这里 len(srcstr) >= len(dststr).

7–10. 加密。

(a) 用上一个练习的思路编写一个"rot13"翻译器。"rot13"是一个古老而又简单的加密方法, 它把字母表中的每个字母用其后的第 13 个字母来代替。字母表中前半部分字母将被映射到后半部分, 而后半部分字母将被映射到前半部分,大小写保持不变。举例来说,'a'将被替换为'n','X'将被替 换为'K'; 数字和符号不进行翻译。

(b)在你的解决方案的基础上加一个应用程序,让它提示用户输入准备加密的字符串(这个算法 同时也可以对加密后的字符串进行解密),如下所示:

% rot13.py

Enter string to rot13: This is a short sentence. Your string to en/decrypt was: [This is a short sentence.].

    The rot13 string is: [Guvf vf n fubeg fragrapr.].%

% rot13.py

Enter string to rot13: Guvf vf n fubeg fragrapr. Your string to en/decrypt was: [Guvf vf n fubeg fragrapr.].

The rot13 string is: [This is a short sentence.].
7–11. 定义。什么组成字典中合法的键? 举例说明字典中合法的键和非法的键。

7-12. 定义。
(a)在数学上,什么是集合?
(b)在 Python 中,关于集合类型的定义是什么?

7–13. 随机数。修改练习 5-17 的代码:使用 random 模块中的 randint()或 randrange()方 法生成一个随机数集合:从 0 到 9(包括 9)中随机选择,生成 1 到 10 个随机数。这些数字组成集合 A(A 可以是可变集合,也可以不是)。同理,按此方法生成集合 B。每次新生成集合 A 和 B 后,显示 结果 A | B 和 A & B

7–14. 用户验证。修改前面的练习,要求用户输入 A | B 和 A & B 的结果,并告诉用户他(或 她)的答案是否正确,而不是将 A | B 和 A & B 的结果直接显示出来。如果用户回答错误,允许他(或 她)修改解决方案,然后重新验证用户输入的答案。如果用户三次提交的答案均不正确,程序将显示 正确结果。

附加题:运用你关于集合的知识,创建某个集合的潜在子集,并询问用户此潜在子集是否真是 该集合的子集,要求和主程序一样有显示更正和答案的功能。

Edit By Vheavens

Edit By Vheavens

7–15. 编写计算器。 这个练习取材于 http://math.hws.edu/ 在线免费 Java 教材中的练习 12.2。编写一个程序允许用户选择两个集合:A 和 B, 及运算操作符。例如,in, not in, &, |, ^, <, <=, >, >=, ==, !=, 等. (你自己定义集合的输入语法,它们并不一定要像 Java 示例中那样用方括 号括住。)解析输入的字符串,按照用户选择的运算进行操作。你写的程序代码应该比 Java 版本的 该程序更简洁。

【python核心编程笔记+习题】-CH7-映射相关推荐

  1. 【python核心编程笔记+习题】-CH5-数字类型

    本章主题 数的简介 整型 布尔型 标准的整型 长整型 浮点型实数 复数 操作符 内建函数 其它数字类型 相关模块 Python 支持多种数字类型:整型.长整型.布尔型.双精度浮点型.十进制浮点型和复数 ...

  2. python核心编程6-14习题的解题思路

    #coding:utf-8 """ python核心编程6-14习题的解题思路 设计一个"石头,剪子,布"游戏,有时又叫"Rochambea ...

  3. python核心编程笔记

    python核心编程–笔记(? 解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 ...

  4. python核心编程--笔记(不定时跟新)(转)

    的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   ...

  5. [PYTHON] 核心编程笔记(14.Python执行环境)

    在python中有多种运行外部程序的方法,比如,运行操作系统命令或另外的python脚本,或执行一个磁盘上的文件,或通过网络来运行文件 在特定执行场景包括: 在当前脚本继续运行 创建和管理子进程 执行 ...

  6. [PYTHON] 核心编程笔记(18.多线程编程)

    18.1 引言/动机 18.2 线程和进程 18.2.1 什么是进程(重量级进程)? 计算机程序只不过是磁盘中可执行的,二进制(或其他类型)的数据,他们只有在被读取到内存中,被操作系统调用时才开始他们 ...

  7. python视窗编程_[PYTHON] 核心编程笔记(19.图形用户界面编程)

    19.1 简介 19.1.1 什么是Tcl,Tk和Tkinter? 19.1.2 安装和使用Tkinter # apt-get install python-tk -y # python ------ ...

  8. python函数赋值给对象_【Python核心编程笔记】一、Python中一切皆对象

    Python中一切皆对象本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做到 ...

  9. python核心编程课后习题解答第二章

    2–1. 变量, print 和字符串格式化运算符.启动交互式解释器.给一些变量赋值(字 符串,数值等等)并通过输入变量名显示它们的值.再用 print 语句做同样的事.这二者有 何区别? 也尝试着使 ...

最新文章

  1. 苦修月余,斩获bigo、腾讯offer,面经奉上!
  2. fasta.img 是什么文件?
  3. linux共享磁盘给指定ip,Linux 磁盘挂载和mount共享
  4. 执行srvctl报错 :error while loading shared libraries: libpthread.so.0:
  5. 怎么修改_PDF怎么修改文字?其实修改PDF内容很简单
  6. Centos7环境安装Kibana5.2.2
  7. android 图片轮播
  8. 可以在中断服务程序执行malloc吗?
  9. python 共享内存_37. Python 多进程锁 多进程共享内存
  10. Visual Assist X Options 注释设置-类
  11. 使用Seay进行代码安全审计
  12. 线阵相机与面阵相机的区别
  13. guid主分区表损坏如何处理_磁盘管理之磁盘分区,主引导分区表修复
  14. 大数据智能下数据脱敏的思考
  15. 根据行数要求实现展开与隐藏TextView
  16. ttkbootstrap 学习
  17. 【日常·闲谈】芯片外围电路如何设计?
  18. Microbiome综述:脊椎动物的皮肤微生物
  19. 【第三趴】uni-app页面搭建与路由配置(了解工程目录结构、学会搭建页面、配置路由并成功运行)
  20. 快压 为什么让我如此厌恶

热门文章

  1. RGSSAD加密与解密
  2. 刨析 SpringBoot 自动装配原理,其实很简单
  3. 03、滤波器设计——阶跃阻抗低通滤波器
  4. 局域网用户的限制和反限制技巧
  5. DDoS 保护、缓解和防御:8 个基本技巧
  6. python语音库_介绍几个python的音频处理库
  7. canon ip 1180 喷墨打印机 mac 驱动
  8. kettle通用插件
  9. P1000刷机知识+获取ROOT+HDVS_ROM快速刷机教程 by fox
  10. 腾讯通服务器文件目录,《腾讯RTX快速部署指南》