昨天介绍完了最常用的列表,之后就是次常用的元组、集合与字典了。

5.3. 元组和序列

元组和之前讲过的列表有很多共同特性,例如索引切片操作。实际上,他们是 序列 数据类型(list, tuple, range)中的两种。

一个元组由几个被逗号隔开的值组成,例如:

>>> t = 12345, 54321, 'hello!' # 元组打包
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # 元组可以嵌套
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
>>> # 元组本身是不可变的
... t[0] = 88888
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> # 但是元组可以包含可变对象,如下面的列表
... v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])

如你所见,元组在输出时总是被圆括号()包围的,以便正确表示嵌套元组。输入时圆括号可有可无,不过经常会是必须的(如果这个元组是一个更大的表达式的一部分)。

虽然元组可能看起来与列表很像,但它们通常是在不同的场景被使用,并且有着不同的用途。元组是 immutable (不可变的),其序列通常包含不同种类的元素,并且通过解包或者索引来访问。列表是 mutable (可变的),并且列表中的元素一般是同种类型的,并且通过迭代访问。给元组中的一个单独的元素赋值是不允许的,当然你可以创建包含可变对象的元组,例如列表。

一个特殊的问题是构造包含0个或1个元素的元组:为了适应这种情况,语法有一些额外的改变。空元组可以直接被一对空圆括号创建,含有一个元素的元组可以通过在这个元素后添加一个逗号来构建(圆括号里只有一个值的话不够明确)。不好看,但是有效。例如:

>>> empty = ()
>>> singleton = 'hello',    # 一个元素后面加了一个逗号,表示是包含一个元素的元组
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)

最后讲解一对概念,元组打包序列解包。如最开始代码中的 t = 12345, 54321, 'hello!'就是元组打包的例子,我们通过x, y, z = t即序列解包,就能得到x = 12345,y = 54321,z = 'hello!'的结果。

实际上元组打包和序列解包是互为逆操作的,注意序列解包要求等号左侧的变量数与右侧序列里所含的元素数相同。而多重赋值,其实也不过是元组打包和序列解包的组合而已。

5.4. 集合

我们都知道,集合是由不重复元素组成的无序的集,所以python中的集合也是如此。它的基本用法包括成员检测(查找)和消除重复元素(去重)。集合对象也支持像 并集,交集,差集等数学运算。花括号{}set() 函数可以用来创建集合

注意:要创建一个空集合你只能用 set() 而不能用 {},因为后者是创建一个空字典,这种数据结构我们会在下面进行讨论。

以下是一些简单的示例:

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # 重复项被自动删除了
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # 检测元素是否在集合中
True
>>> 'crabgrass' in basket
False>>> # 两个字母集合之间进行运算
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # 一段字母去重后的即为集合
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # a有但是b没有的字母(差集)
{'r', 'd', 'b'}
>>> a | b                              # a或者b有的字母(并集)
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # a和b都有的字母(交集)
{'a', 'c'}
>>> a ^ b                              # a或b只有一个有的字母(异或)
{'r', 'd', 'b', 'm', 'z', 'l'}

类似于 列表推导式,集合也支持推导式形式(集合推导式):

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

5.5. 字典

另一个非常有用的 Python 內置数据类型是字典。字典在其他语言里可能会被叫做联合内存 或联合数组。与以连续整数为索引的序列不同,字典是以关键字为索引的,关键字可以是任意不可变类型,通常是字符串或数字。如果一个元组只包含字符串、数字或元组,那么这个元组也可以用作关键字。但如果元组直接或间接地包含了可变对象,那么它就不能用作关键字列表不能用作关键字,因为列表可以通过索引、切片或 append() 和 extend() 之类的方法来改变(可变类型)。

理解字典的最好方式,就是将它看做是一个 键: 值 对的集合,键必须是唯一的(在一个字典中)。一对花括号(大括号){}可以创建一个空字典 。另一种初始化字典的方式是在一对花括号里放置一些以逗号分隔的键值对,而这也是字典输出的方式。

字典主要的操作是使用关键字存储和解析值。也可以用 del 来删除一个键值对。如果你使用了一个已经存在的关键字来存储值,那么之前与这个关键字关联的值就会被遗忘。用一个不存在的键来取值则会报错

对一个字典执行 list() 将返回包含该字典中所有键的列表,按插入次序排列 (如需其他排序,则要使用 sorted())。要检查字典中是否存在一个特定键,可使用 in 关键字。

以下是使用字典的一些简单示例:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'jack': 4098, 'sape': 4139, 'guido': 4127}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'jack': 4098, 'guido': 4127, 'irv': 4127}
>>> list(tel)
['jack', 'guido', 'irv']
>>> sorted(tel)
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

除了用花括号,也可以用dict() 构造函数直接从键值对序列里创建字典:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'guido': 4127, 'jack': 4098}

当关键字是简单字符串时,有时直接通过关键字参数来指定键值对更方便:

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'guido': 4127, 'jack': 4098}

此外,字典推导式可以从任意的键值表达式中创建字典:

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

每天一小时python官方文档学习(五)————数据结构之元组、集合与字典相关推荐

  1. 每天一小时python官方文档学习(一)————python的简单介绍

    我们都知道,python的官方文档写得十分详尽,也是每一个学习python的人都绕不开的. 所以从今天开始,我每天都会用一小时学习python的官方文档,按照文档目录的顺序,摘录一些有用的语句,写下一 ...

  2. 每天一小时python官方文档学习(七)————模块与包

    6. 模块 模块是一个包含Python定义和语句的文件,实际上就是一个正常的.py文件.但是作用和普通需要运行的程序不一样,它实际上有点像函数.如果说函数实现了代码的重用,模块则是实现了函数的重用.我 ...

  3. 每天一小时python官方文档学习(四)————数据结构之列表

    终于进入到第五章数据结构部分了,python中常用的容器有列表.元组.集合和字典,今天主要了解的是最为常用的列表. 5. 数据结构 5.1. 列表的更多特性 对于列表的操作有很多,具体操作看官方文档就 ...

  4. 每天一小时python官方文档学习(六)————循环和条件控制的进阶用法

    学习完数据结构之后,我们就能够对之前在第二天中讲过的流程控制工具,添加更多的用法了,这里主要介绍的是for循环语句和if与while条件判断语句. 5.6. 循环的技巧 我们学过的遍历序列for i ...

  5. 每天一小时python官方文档学习(三)————函数

    上一天看到第四章的一半,介绍了一些常用的流程控制工具,也就是常用语句,主要是if.for.range().break.continue.else和pass.今天把第四章剩下的看完,讲的是如何在pyth ...

  6. 每天一小时python官方文档学习(二)————流程控制工具

    4. 其他流程控制工具 4.1. if 语句 大多数人都很熟悉的if语句: if condition1:pass elif condition2:pass else condition3:pass 注 ...

  7. Python官方文档学习心得(第三篇)

    1.定义方法 关键字 def 是方法定义的标志.接下来紧跟方法名和被圆括号所包围的参数列表.方法的主 体语句将在下一行开始并且必须缩进. 方法主体的首句可选择性地是一句字符,用来说明方法的主要功能 例 ...

  8. Python官方文档学习心得(第六篇)

    1.作用域 关键字 global 和 nonlocal会影响变量绑定,因为是全局变量 2.类 因此类可以定义一个名叫_init()的特殊方法,如下: def__init__(self): self.d ...

  9. Python官方文档学习心得(第五篇)

    1.模块 一个模块是包含 python 定义和语句的文件.文件名称是由模块名加上后缀名.py 组成的.在 模块中,模块的名字(可以作为一个字符串)是一个作为全局变量_name_的值的变量 fibo是模 ...

最新文章

  1. python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍
  2. 【AGC014E】Blue and Red Tree
  3. How to make Windows Form app truly Full Screen (and to hide Taskbar) in C#? 转
  4. mysql sleep连接过多的完美解决办法
  5. 哈夫曼(Huffman)编码问题(C++)
  6. mysql shell命令和作用_MySQL的一些功能实用的Linux shell脚本分享
  7. vue + typescript 父子组件传值记录
  8. 天涯明月刀手游服务器维护中,《天涯明月刀手游》12月17日服务器维护更新公告...
  9. 刚斩获头条美团的offer,Java开发面试题详解(带答案)
  10. 发现一个识图比较厉害的网站
  11. 如何自己制作一个RISC指令集的CPU?
  12. Android集成腾讯Bugly和简单使用
  13. 结婚证照片尺寸是多少?教你拍出好看的证件照照片
  14. 字节跳动 2022年春招
  15. wordCount的解析
  16. 这位创业者足够疯狂:他选择向微软发起挑战
  17. 外壳IK碰撞冲击测试
  18. 知乎在商业化的道路上大动作频频,知乎,直乎,播乎?
  19. android来电酷炫秀-注册,登录,找回密码
  20. ubuntu20.04蓝牙连接airpods

热门文章

  1. Android 清除png图片的白色背景
  2. 【遥感数字图像处理】实验:遥感图像分析方法大全(Erdas版)
  3. T-SQL编程基础之二:条件选择、循环编程
  4. C#趣味程序---车牌号判断
  5. Android之奔溃提示com.google.gson.internal.LinkedTreeMap cannot be cast to java.util.HashMap
  6. Hibernate 对象的三种状态
  7. GFS(Genetic Fuzzy Systems)—— 基于专家先验规则库和遗传算法相结合的智能体决策算法
  8. 真正的男人要勇于承担责任......
  9. 年仅53岁,因连续工作、过度劳累,这位抗疫幕后的科研专家去世
  10. 这些高校竟因名字太“坑爹”被误会为三本?盘点九所实力强劲但被名字耽误的大学...