列表与元组

Python中的字符串、列表、元组均属于序列类型。对于序列类型,它们有很多共同的操作,且很多都在字符串那篇学习了。本篇先简单回顾序列共同的操作,然后重点学习列表独有的操作,以及列表与元组的对比。

Python的序列类型是指元素按照位置编号顺序存储的一类数据类型,包括字符串、列表与元组。列表和元组可以存储不同的数据类型,其中列表的元素可以修改;而元组和字符串一样,其中的元素是不能修改的。

序列通用操作

字符串、列表、元组共有的操作。这些操作不会改变序列本身的元素,而是返回一个序列。

索引与分片

索引包括正索引负索引;分片可以使用正索引和负索引且可以指定步长。在字符串那里详细学习了。

序列的计算

可以对序列进行+*的操作。需要注意两个序列必须是同一类型,元组和列表也不能!

  1. 序列相加:将两个序列拼接起来。
  2. 序列乘法:序列重复n次。如果n<1则返回一个空序列。
  3. 序列比较:从左到右开始比,直到比出大小。
  4. 成员测试:in或not in测试前者是否是后面序列的元素。

序列处理函数

  1. len(seq):获取序列的长度
  2. max(seq):获取序列中最大的元素
  3. min(seq):获取序列中最小的元素
  4. sum(seq):计算序列中所有元素的和,要求所有元素都是数值。
  5. zip(seq):接收任意多个序列作为参数,将各序列对应位置的元素合并成一个元组,最后返回一个迭代器

    • 要合并的多个序列如果长度不等,则以长度最短的为准。
    • 使用zip(*seq)可以将zip对象解压还原,得到的还是一个迭代器,所以需要转化为list。

      Untitled

  6. sorted(seq,reverse=False):将序列中的元素排序后返回一个新的序列。reverseFalse时表示升序,True时为降序,默认是升序

  7. reversed(seq):将seq中的元素按原来顺序的逆序排列,以迭代器的形式返回。

序列拆分赋值

可以将一个序列的值依次赋值给一系列变量:

Untitled

为了避免这个错误,中间可以有一个元素使用*,表示将序列中间的元素组成一个列表赋值给它:

Untitled

实际上,这种拆分赋值方式更常用于函数的可变长度传参。

列表的专有操作

列表解析

列表解析是平时构造列表的一个比较常用的方式。它的格式为[表达式 for语句]。表达式对for中的循环变量进行计算,计算的结果作为列表的一个元素。

1
2
3
seq=[i**2 for i in range[5]]
# 获得酷狗音乐TOP500的网页url,组成一个列表
urls=['https://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1,24)]

元素修改

列表与字符串、元组不同点就是它的元素可以修改。

  1. 元素赋值
  2. 元素删除:使用del语句可以将某个位置的元素从列表中移除,也可以删除整个序列(包括字符串和元组)。

    Untitled

  3. 分片赋值:将列表的子序列赋值为另一个子序列。可以使用分片赋值的方式来删除列表的一个子序列。

列表的常用方法

通用的进行序列处理的大多都是函数,列表这里独有的一般都是方法。

按值查找

按值查找对于字符串和元组也是通用的。主要是两个方法:

  1. s.count(x):查找值x在s中出现的次数。如果x不是s中的元素结果为0
  2. s.index(x):查找值x在s中第一次出现的下标。如果x不是s中的元素会报错!

元素增删

  1. s.append(x):向s的末尾插入元素x
  2. s.extend(s1):向s的末尾插入序列s1
  3. s.pop(i):删除并返回列表下标为i的元素,i缺省则默认为列表的最后一个元素;如果i超出了列表的索引范围会报错!

    popdel的区别是删除后是否会返回这个值。这个特性是很好的,C++的pop就没有返回,还要自己先暂存要pop的值,有点繁琐。

  4. s.insert(i,x):在列表下标为i的位置插入元素x。如果i超出了索引范围则插入到开头(负索引)或最后(正索引)。

    Untitled

  5. s.remove(x):从列表中删除从左到右第一个值为x的元素。和pop和del不同的是remove按值删除。

元素排序

列表的sort方法与reverse方法可以实现和sorted函数与reversed函数相同的效果,区别是前者直接修改列表本身

  1. s.sort(reverse=False):默认升序,True为降序。
  2. s.reverse():将s逆序。

    Untitled

列表与元组比较

  1. 列表元素包括在中括号[]中,而元组的元素包括在小括号()中。
  2. 元组是不可变类型的序列,所以它更安全;列表是可变类型序列,处理更加灵活。
  3. 元组可以作为字典的键来使用,而列表不能。
  4. 使用list()tuple()可以轻松实现列表和元组的转换。