03 python序列、列表、元组

1、序列

1.1、什么是序列

  • 数据结构是以某种方式(如通过编号)组合起来的数据元素(如数、字符乃至其他数据结构)集合。在Python中,最基本的数据结构为序列(sequence)。
  • 序列中的每个元素都有编号,即其位置或索引,其中第一个元素的索引为0。用负索引表示序列末尾元素的位置。
  • 序列包含三种:列表、元组、字符串。
  • 容器:

序列:(如列表和元组)在序列中,每个元素都有编号

      • 列表:可以修改的序列
      • 元组: 不可以修改的序列
      • 字符串:不可以修改的序列

映射:(如字典)在映射中,每个元素都有名称(也叫键)

  • 序列还可包含其他序列。
>>> edward = ['Edward Gumby', 42]
>>> john = ['John Smith', 50]
>>> database = [edward, john]
>>> database
[['Edward Gumby', 42], ['John Smith', 50]]
  • 内置函数len、min和max很有用,其中函数len返回序列包含的元素个数,而min和max分别返回序列中最小和最大的元素

1.2、序列的基本操作

索引、切片、相加、相乘和成员资格检查。

1、索引

  • 使用索引来访问单个元素
  • 序列中的所有元素都有编号——从0开始递增。
>>> greeting = 'Hello'
>>> greeting[0]
'H'
  • 用负数索引时,Python将从右(即从最后一个元素)开始往左数,因此-1是最后一个元素的位置。
>>> greeting[-1]
'o'
  • 对于字符串字面量(以及其他的序列字面量),可直接对其执行索引操作,无需先将其赋给变量。
>>> 'Hello'[1]
'e'
  • 如果函数调用返回一个序列,可直接对其执行索引操作。
>>> fourth = input('Year: ')[-4]
Year: 2005
>>> fourth
'2'

2、切片

  • 使用切片(slicing)来访问特定范围内的元素,可使用两个索引,并用冒号分隔。
  • 第一个索引指定的元素包含在切片内,但第二个索引指定的元素不包含在切片内。
  • 对序列执行切片操作时,返回的切片都是副本
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[3:6] 
[4, 5, 6]

(1)简写

  • 如果切片结束于序列末尾,可省略第二个索引。
>>> numbers[-3:]
[8, 9, 10]
  • 如果切片始于序列开头,可省略第一个索引。
>>> numbers[:3]
[1, 2, 3]
  • 要复制整个序列,可将两个索引都省略。
>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(2)步长

  • [开始索引:结束索引:步长]
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
  • 显式地指定步长时,也可以使用简写。
>>> numbers[::4]
[1, 5, 9]
  • 步长不能为0,否则无法向前移动,但可以为负数,即从右向左提取元素。
  • 步长为负数时,第一个索引在序列中的位置必须在第二个索引的右边,第一个索引依然包含在内,而第二个索引不包含在内。
  • 步长是正数时,从左向右;步长是负数时,从右向左。
>>> numbers[8:3:-2]    #步长可以是负数
[9, 7, 5]

>>> numbers[3:8:-2]    #索引3的位置在索引8的左边
[]
>>> numbers[-2:5:-2]
[9, 7]

>>> numbers[5::-1]    #步长为负时,省略第二索引,表示从右向左取到最后一个元素
[6, 5, 4, 3, 2, 1]
>>> numbers[:5:-1]    #步长为负时,省略第一索引,表示从右向左,从第一个元素取
[10, 9, 8, 7]
>>> numbers[::-1]     #表示将序列逆序
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

3、序列相加

  • 可使用加法运算符来拼接序列。
>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,' + 'world!'  #字符串拼接,”+“号每出现一次就会在内存中重新开辟一块空间
'Hello,world!'
  • 不能拼接列表和字符串,虽然它们都是序列。一般而言,不能拼接不同类型的序列。
>>> [1, 2, 3] + 'world!'
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    [1, 2, 3] + 'world!'
TypeError: can only concatenate list (not "str") to list

4、乘法

  • 将序列与数n相乘时,将重复这个序列n次来创建一个新序列
>>> 'python' * 5
'pythonpythonpythonpythonpython'
>>> [42] * 10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
  • None、空列表和初始化

空列表是使用不包含任何内容的两个方括号([])表示的。
在Python中,None表示什么都没有。
列表的长度初始化为10,可像下面这样做:

>>> sequence = [None] * 10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]

5、成员资格

  • 要检查特定的值是否包含在序列中,可使用运算符in。
  • 返回相应的值:满足时返回True,不满足时返回False。
>>> permissions = 'rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False

>>> users = ['mlh', 'foo', 'bar']
>>> input('Enter your user name: ') in users
Enter your user name: mlh
True
  • 在较早的Python版本中,成员资格检查只能检测字符是否包含在字符串中,但现在可使用运算符in来检查指定的字符串是否为另一个字符串的子串。
>>> 'py' in 'python'
True
>>> 'Py' in 'python'  #区分大小写
False

2、列表,可以修改的序列

  • 列表不同于元组和字符串——列表是可变的,即可修改其内容。
  • 空列表是使用不包含任何内容的两个方括号([])表示的。
  • 列表的切片是列表。

2.1、创建列表

>>> []      #空列表
[]
>>> [1]    #有一个元素的列表
[1]
>>> [1,2,3]   #有多个元素的列表
[1, 2, 3]

>>>name_list=['alex', 'seven', 'eric']
['alex', 'seven', 'eric']
  • 函数list:它将一个序列作为参数,并将其转换为列表。
>>> h=list()    #空列表
>>> h
[]

>>> hi=list('Hello')
>>> hi
['H', 'e', 'l', 'l', 'o']

>>> name_list=list(['alex', 'seven', 'eric'])
>>> name_list
['alex', 'seven', 'eric']

>>> num=list((1,2,3))
>>> num
[1, 2, 3]

2.2、基本的列表操作

可对列表执行所有的标准序列操作,如索引、切片、拼接和相乘

1、修改列表:给元素赋值

  • 修改列表很容易,但不是使用类似于x = 2这样的赋值语句,而是使用索引表示法给特定位置的元素赋值,如x[1] = 2。
>>> x = [1, 1, 1]
>>> x[1] = 2
>>> x
[1, 2, 1]
  • 不能给不存在的元素赋值,因此如果列表的长度为3,就不能给索引大于2的元素赋值。
>>> x[3]=4
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    x[3]=4
IndexError: list assignment index out of range

2、给切片赋值

  • 通过使用切片赋值,可将切片替换为长度与其不同的序列。

x[m:n] = [任意长度的序列]

>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']

>>> name[1:4] =[]    #给切片赋值一个空序列,相当于删除切片中的元素
>>> name
['P', 'o', 'n']
  • 使用切片赋值还可在不替换原有元素的情况下插入新元素。

x[m:m] = [任意长度的序列]

>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]

3、删除元素

  • 从列表中删除元素,只需使用del语句即可。
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Dee-Dee', 'Earl']

>>> del names[1:3]
>>> names
['Alice', 'Earl']

2.3、列表方法详解

  • n:索引,x:对象

1、clear()

  • 方法clear就地清空列表的内容。修改原列表,不返回任何值。
>>> lst = [1, 2, 3]
>>> lst.clear()
>>> lst
[]
  • 类似于切片赋值语句lst[:] = []。

2、copy()深浅

  • 方法copy复制列表,创建了一个副本。
  • 浅copy,只copy第一层,即第一层相互独立,其他层不独立。
>>> a=[1,2,3,[4,5,6]]
>>> b=a[:]      #第一种浅copy,三种浅copy效果相同
>>> c=a.copy()      #第二种浅copy
>>> d=list(a)       #第三种浅copy

>>> c[0]='1'      #改变第一层不影响其他列表
>>> a
[1, 2, 3, [4, 5, 6]]
>>> c
['1', 2, 3, [4, 5, 6]]

>>> c[3][0]='4'    #改变其他层影响其他列表
>>> a
[1, 2, 3, ['4', 5, 6]]
>>> c
['1', 2, 3, ['4', 5, 6]]
  • 深copy,生产一个完全独立的列表。
>>> import copy
>>> a=[1,2,3,[4,5,6]]
>>> c=copy.deepcopy(a)

>>> c[0]='1'    #改变第一层不影响其他列表
>>> a
[1, 2, 3, [4, 5, 6]]
>>> c
['1', 2, 3, [4, 5, 6]]

>>> c[3][0]='4'     #改变其他层也不影响其他列表
>>> a
[1, 2, 3, [4, 5, 6]]
>>> c
['1', 2, 3, ['4', 5, 6]]

3、count()

  • 方法count计算指定的元素在列表中出现了多少次。
>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2
>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
>>> x.count(1)
2
>>> x.count([1, 2])
1

4、index()

  • 方法index在列表中查找指定值第一次出现的索引。enumerate
>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
>>> knights.index('who')
4

>>> knights.index('herring')
Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    knights.index('herring')
ValueError: 'herring' is not in list

5、pop(n)

  • 方法pop从列表中删除一个元素(末尾为最后一个元素),并返回这一元素。修改原列表,返回被删除的元素。
  • pop是唯一既修改列表又返回一个非None值的列表方法。默认最后一个
  • 使用pop可实现一种常见的数据结构——栈(stack)。后进先出(LIFO)。
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x.pop()
9
>>> x
[1, 2, 3, 4, 5, 6, 7, 8]
>>> x.pop()
8
>>> x
[1, 2, 3, 4, 5, 6, 7]
>>> x.pop(2)
3
>>> x
[1, 2, 4, 5, 6, 7, 8]

6、append(x)

  • 方法append用于将一个对象附加到列表末尾。修改原列表,不返回任何值。
>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
7、extend(x)
  • 方法extend让你能够同时将多个值附加到列表末尾,使用一个列表来扩展另一个列表。修改原列表,不返回任何值。
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
  • 与拼接不同
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]
  • 与将列表赋给切片效果相同,但可读性不高
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a[len(a):] = b
>>> a
[1, 2, 3, 4, 5, 6] 

8、insert

  • 方法insert用于将一个对象插入列表。
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(3, 'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
  • 与extend一样,也可使用切片赋值来获得与insert一样的效果。
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers[3:3] = ['four']
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]

9、remove(元素)

  • 方法remove用于删除第一个为指定值的元素。修改原列表,不返回任何值。
>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']

>>> x.remove('bee')
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    x.remove('bee')
ValueError: list.remove(x): x not in list

10、reverse()

  • 方法reverse按相反的顺序排列列表中的元素。修改原列表,不返回任何值。
>>> x = [5, 1, 3, 2]
>>> x.reverse()
>>> x
[2, 3, 1, 5]

11、sort()

  • 方法sort用于对列表就地排序。修改原列表,不返回任何值。
>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort()
>>> x
[1, 2, 4, 6, 7, 9]
  • 方法sort接受两个可选参数:key和reverse。
    • 参数key,将其设置为一个用于排序的函数。根据函数为每个元素创建的键进行排序。要根据长度对元素进行排序,可将参数key设置为函数len。
>>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate']
>>> x.sort(key=len)
>>> x
['add', 'acme', 'aerate', 'abalone', 'aardvark']
    • 参数reverse,只需将其指定为一个真值(True或False),以指出是否要按相反的顺序对列表进行排序。
>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort(reverse=True)
>>> x
[9, 7, 6, 4, 2, 1]
###升序
num = [9,4, 6, 2, 1, 7, 9,8]
for i in range(len(num)):
    for j in range(i+1,len(num)):
        if num[i] > num[j]:
            num[i],num[j] = num[j],num[i]
print(num)
###降序
num = [9,4, 6, 2, 1, 7, 9,8]
for i in range(len(num)):
    for j in range(i+1,len(num)):
        if num[i] < num[j]:
            num[i],num[j] = num[j],num[i]
print(num)
冒泡排序:

2.4、列表方法附录

  • 列表常用的内置函数

len(seq):返回序列的长度。
max(args):返回序列或一组参数中的最大值。
min(args):返回序列和一组参数中的最小值。
reversed(seq):让你能够反向迭代序列。
sorted(seq):返回一个有序列表,其中包含指定序列中的所有元素。
enumerate(iterable):迭代iterable中所有项的(index,item)。可提供关键字参数start,以便不从开头开始迭代。
list(seq):将序列转换为列表。

2.5、列表总结

1、查看列表

>>> hh1 = ['a', 'b', 'c', 1, 2, 3 , 'a', 3, 'a']
>>> hh1[1]        #索引
'b'
>>> hh1[1:3]        #切片
['b', 'c']
>>> hh1.count('a')    #查看元素出现的次数
3
>>> hh1.index(3)      #查看元素第一次出现的索引(从左向右)
5
>>> 'a' in hh1      #查看某元素是否在列表中
True

2、添加列表元素

>>> hh2 = [1,'a']

>>> hh2.append(45)      #向列表尾部添加一个元素
>>> hh2
[1, 'a', 45]

>>> hh2.insert(1,'heng')   #向列表指定位置添加一个元素
>>> hh2
[1, 'heng', 'a', 45]

>>> hh2[1:1] = [1, 2]    #向列表指定位置添加一个或多个元素  
>>> hh2
[1, 1, 2, 'heng', 'a', 45]

>>> a = ['mai','heng']    #用另一个列表扩展列表
>>> hh2.extend(a)
>>> hh2
[1, 1, 2, 'heng', 'a', 45, 'mai', 'heng']

###列表拼接
>>> a =[1, 2, 3]
>>> b =[4, 5, 6]
>>> c = a + b    #加号(+)拼接
>>> a
[1, 2, 3]
>>> b
[4, 5, 6]
>>> c
[1, 2, 3, 4, 5, 6]
>>> d = a * 3    #乘号(*)拼接
>>> d
[1, 2, 3, 1, 2, 3, 1, 2, 3]

3、修改列表

>>> hh3 = ['a', 'b', 'c']

>>> hh3[1]=2          #替换一个元素
>>> hh3
['a', 2, 'c']

>>> hh3[1:2] = ['x', 'y']  #替换一个或多个元素
>>> hh3
['a', 'x', 'y', 'c']

 4、删除列表元素、删除列表

>>> hh4 = ['a', 'b', 'c', 1, 2, 3 , 'a', 3, 'a']

>>> hh4.remove('a')    #删除第一个指定元素(从左向右)
>>> hh4
['b', 'c', 1, 2, 3, 'a', 3, 'a']

>>> hh4.pop()      #删除最后一个元素,并返回该元素
'a'
>>> hh4
['b', 'c', 1, 2, 3, 'a', 3]
>>> hh4.pop()
3
>>> hh4
['b', 'c', 1, 2, 3, 'a']

>>> hh4.pop(2)      #删除指定索引的元素,并返回该元素    
1
>>> hh4
['b', 'c', 2, 3, 'a']

>>> del hh4[2]      #删除指定索引的元素
>>> hh4
['b', 'c', 3, 'a']
>>> hh4.clear()      #清空列表
>>> hh4
[]
>>> del hh4        #删除列表的名称及引用
>>> hh4
Traceback (most recent call last):
  File "<pyshell#70>", line 1, in <module>
    hh4
NameError: name 'hh4' is not defined

 5、列表元素排序

>>> hh5 = [1, 4 ,2, 8]    #正序排序
>>> hh5.sort()
>>> hh5
[1, 2, 4, 8]
>>> hh5 = ['e', 'a', 'g']
>>> hh5.sort()
>>> hh5
['a', 'e', 'g']

>>> hh5 = [1, 4 ,2, 8]    #逆序排序
>>> hh5.reverse()
>>> hh5
[8, 2, 4, 1]
>>> hh5 = ['e', 'a', 'g']
>>> hh5.reverse()
>>> hh5
['g', 'a', 'e']

6、身份判断

>>> hh6 = [1, 2, 3]
>>> type(hh6) is list  #判断对象是否是列表
True
>>> hh6 = 'hengha'
>>> type(hh6) is list
False

3、元组:不可修改的序列

  • 元组语法很简单,只要将一些值用逗号分隔,就能自动创建一个元组。(逗号至关重要)
  • 元组还可用圆括号括起(这也是通常采用的做法)。
  • 空元组用两个不包含任何内容的圆括号表示。
  • 函数tuple的工作原理与list很像:它将一个序列作为参数,并将其转换为元组。
  • 元组的切片是元组

3.1、创建元组

>>> ()     #空元组
()
>>> 1,     #只有一个元素的元组,必须加上逗号
(1,)
>>> 1,2,3    #有多个元素的元组
(1, 2, 3)
>>> (1,2,3)  #加上小括号    
(1, 2, 3)
  • 函数tuple:它将一个序列作为参数,并将其转换为元组
>>> h=tuple()    #空元组
>>> h
()

>>> tuple('abc')
('a', 'b', 'c')

>>> tuple([1, 2, 3])
(1, 2, 3)

>>> tuple((1, 2, 3))
(1, 2, 3)

3.2、元组的方法

  • 只有2个方法,一个是count,一个是index。
  • 常用的内置函数

max(args):返回序列或一组参数中的最大值。
min(args):返回序列和一组参数中的最小值。
sum(seq[, start]) 计算数字序列中所有元素的总和,再加上可选参数start的值(默认为零),然后返回结果
len(seq):返回序列的长度。
sorted(seq):返回一个有序列表,其中包含指定序列中的所有元素。
tuple(seq):将序列转换为元组

3.3、为何要熟悉元组呢?

  • 它们用作映射中的键(以及集合的成员),而列表不行。
  • 有些内置函数和方法返回元组。只要不尝试修改元组,对元组的操作与列表一样(需要使用元组没有的index和count等方法时例外)。
posted @ 2021-01-20 19:11  麦恒  阅读(125)  评论(0编辑  收藏  举报