一文看懂系列:元组、列表、字典、集合

一、数据结构

1、元组 

  • 含义 :元组是一种固定长度、不可变的Python对象序列。虽然对象元组中存储的对象其自身是可变的,但是元组一旦创建,各个位置上的对象是无法被修改的。

  • 创建 :创建元组最简单的办法就是用逗号分隔序列值。你可以使用 tuple 函数将任意序列或迭代器转换为元组。

  • 获取元素 :元组的元素可以通过中括号[]来获取,在大多数序列类型中都可以使用这个方法。和C、C++、Java以及很多其他语言一样,Python中的序列索引是从0开始的。

  • 修改 :如果元组中的一个对象是可变的,例如列表,你可以在它内部进行修改。可以使用+号连接元组来生成更长的元组。将元组乘以整数,则会和列表一样,生成含有多份拷贝的元组。

  • 拆包 :如果你想要将元组型的表达式赋值给变量,Python会对等号右边的值进行拆包。即使是嵌套元组也可以拆包。Python语言新增了一些更为高级的元组拆包功能,用于帮助你从元组的起始位置“采集“一些元素。这个功能使用特殊的语法*rest,用于在函数调用时获取任意长度的位置参数列表。rest部分有时是你想要丢弃的数据,rest这个变量名并没有什么特殊之处,为了方便,很多Python编程者会使用下划线(_)来表示不想要的变量。

  • 方法 :由于元组的内容和长度是无法改变的,它的实例方法很少。一个常见的有用方法是 count(列表中也可用),用于计量某个数值在元组中出现的次数。


2、列表

  • 含义 :与元组不同,列表的长度是可变的,它所包含的内容也是可以修改的。列表与元组非常相似(尽管元组不可修改),它们的很多函数用法是相似的。

  • 创建 :你可以使用中括号 [] 或者 list 类型函数来定义列表。list 函数在数据处理中常用于将迭代器或者生成器转化为列表。

  • 修改 :

  •   增加 :① 使用 append 方法可以将元素添加到列表的尾部。② 如果你有一个已经定义的列表,你可以用 extend 方法向该列表添加多个元素。③ 与元组类似,两个列表可以使用+号连接。【请注意通过添加内容来连接列表是一种相对高代价的操作,这是因为连接过程中创建了新列表,并且还要复制对象。使用extend将元素添加到已经存在的列表是更好的方式,尤其是在你需要构建一个大型列表时。】

  •   插入 :使用insert方法可以将元素插入到指定的列表位置(参数为位置、值)。【insert与append相比,计算代价更高。因为子序列元素不得不在内部移动为新元素提供空间。如果你想要在序列的头部和尾部都插入元素,那你应该探索下collections.deque,它是一个双端队列,可以满足头尾部都增加的要求。】

  •   移除 :insert的反操作是 pop,该操作会将特定位置的元素移除并返回。

  •   删除 :元素可以通过 remove方法移除,该方法会定位第一个符合要求的值并移除它。

  • 检查 :使用in关键字可以检查一个值是否在列表中,not关键字可以用作in的反义词,表示“不在”。【与字典、集合(后面会介绍)相比,检查列表中是否包含一个值是非常缓慢的。这是因为Python在列表中进行了线性逐个扫描,而在字典和集合中Python是同时检查所有元素的(基于哈希表)。】

  • 排序 :你可以调用列表的 sort 方法对列表进行内部排序(无须新建一个对象)。sort有一些选项偶尔会派上用场。其中一项是传递一个二级排序key——一个用于生成排序值的函数。例如,我们可以通过字符串的长度进行排序,||  a.sort(key = len)  ||。

  • 切片 :使用切片符号可以对大多数序列类型选取其子集,它的基本形式是将start:stop传入到索引符号[ ]中。由于起始位置start的索引是包含的,而结束位置stop的索引并不包含,因此元素的数量是stop-start。start和stop是可以省略的,如果省略的话会默认传入序列的起始位置或结束位置。负索引可以从序列的尾部进行索引,|| seq[-4:] ||,当需要对列表或元组进行翻转时,一种很聪明的用法就是向步进传值-1。切片还可以将序列赋值给变量,|| seq[3:4] = [6,3] ||。

  • 内建序列函数 :

  • ① enumerate :我们经常需要在遍历一个序列的同时追踪当前元素的索引,由于这种场景很常见,所以Python内建了enumerate函数,返回了(i, value)元组的序列,其中value是元素的值,i是元素的索引。当你需要对数据建立索引时,一种有效的模式就是使用enumerate构造一个字典,将序列值(假设是唯一的)映射到索引位置上。

  • ② sorted :sorted 函数返回一个根据任意序列中的元素新建的已排序列表。

  • ③ zip :zip 将列表、元组或其他序列的元素配对,新建一个元组构成的列表。zip可以处理任意长度的序列,它生成列表长度由最短的序列决定。zip的常用场景为同时遍历多个序列,有时候会和enumerate同时使用。给定一个已“配对”的序列时,zip函数有一种机智的方式去“拆分”序列。这种方式的另一种思路就是将行的列表转换为列的列表。语法看上去略显魔幻。

  • ④ reversed :reversed函数将序列的元素倒序排列。


3、字典

  • 含义 :dict(字典)可能是Python内建数据结构中最重要的。它更为常用的名字是哈希表或者是关联数组。字典是拥有灵活尺寸的键值对集合,其中键和值都是Python对象。

  • 创建 :① 用大括号{}是创建字典的一种方式,在字典中用逗号将键值对分隔。② 从序列生成字典:由于字典本质上是2-元组(含有2个元素的元组)的集合,字典是可以接受一个2-元组的列表作为参数的。||  mapping = dict(zip(a,b))  ||

  • 检查 :使用in关键字。

  • 访问 : ||  a[key] || 或 ||  a[value] ||。keys方法和values方法会分别为你提供字典键、值的迭代器。然而键值对并没有特定的顺序,这些函数输出的键、值都是按照相同的顺序。

  • 删除 :你可以使用 del 关键字或 pop 方法删除值,pop方法会在删除的同时返回被删的值,并删除键。

  • 合并 : 你可以使用 update 方法将两个字典合并。update方法改变了字典中元素位置,因此对于任何原字典中已经存在的键,如果传给update方法的数据也含有相同的键,则它的值将会被覆盖。

  • 默认值 : 字典的 get 方法和 pop 方法可以返回一个默认值,||  value = some_dict.get(key , default_value),带有默认值的get方法会在key参数不是字典的键时返回None,而pop会抛出异常。

  • 方法 : setdefault() 、defaultdict() 。

  • 有效的字典键类型 :尽管字典的值可以是任何Python对象,但键必须是不可变的对象,比如标量类型(整数、浮点数、字符串)或元组(且元组内对象也必须是不可变对象)。这里要使用到一个术语叫作哈希化,通过 hash 函数可以检查一个对象是否可以哈希化(即是否可以用作字典的键)。为了将列表作为键,一种方式就是将其转换为元组,而元组只要它内部元素都可以哈希化,则它自己也可哈希化。


4、集合

  • 含义 :集合是一种无序且元素唯一的容器,没有重复值。你可以认为集合也像字典,但是只有键没有值。和字典类似,集合的元素必须是不可变的。如果想要包含列表型的元素,必须先转换为元组。

  • 创建 :集合可以有两种创建方式:通过 set 函数或者是用字面值集与大括号{}的语法。

  • 操作 :① 联合(两个集合的联合就是两个集合中不同元素的并集。可以通过union方法(a.union(b))或 “ | ” 二元操作符(a|b)完成)、② 交集(交集包含了两个集合中同时包含的元素。可以使用&操作符(a&b)或intersection方法(a.intersection(b))获得交集)、③ 差集(可以通过difference方法(a.difference(b))或 “ - ” 二元操作符(a-b)完成)。

  • 检查 :你还可以检查一个集合是否是另一个结合的子集(包含于)issubset 或超集(包含)isuperset。当且仅当两个集合的内容一模一样时,两个集合才相等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值