《疯狂Python》学习第4课

Python 专栏收录该内容
8 篇文章 0 订阅

第2章 列表、元组和字典

    本章将会介绍Python内置的三种常用数据结构:列表(list)、元组(tuple)和字典( diet )。
    列表和元组比较相似,它们都按顺序保存元素, 每个元素都有自己的索引,因此列表和元组都可通过索引访问元素。二者的区别在于元组是不可修改的,但列表是可修改的。字典则以key-value的形式保存数据。

2.1 序列

    所谓序列,指的是一种包含多项数据的数据结构,序列包含的多个数据项(也叫成员)按顺序排列,可通过索引来访问成员。

2.1.1 Python的序列

    Python的常见序列类型包括字符串、列表、元组等。
    元组是不可变的,元组一旦构建出来,程序就不能修改元组所包含的成员;但序列是可变的,程序可以修改序列所包含的元素。

2.1.2 创建列表和元组

    列表和元组的创建方式类似,区别只是创建列表使用方括号, 创建元组使用圆括号。
    创建列表的语法格式如下:
[elel , ele2, ele3 , … ]
    创建元组的语法格式如下:
(elel, ele2, ele3 , … )

2.2 列表和元组的同样用法

    列表和元组非常相似,它们都可包含多个元素,多个元素也有各自的索引。程序可通过索引来操作这些元素,只要不涉及改变元素的操作,列表和元组的用法是通用的。

2.2.1 通过索引使用元素

    列表和元组都可通过索引来访问元素,它们的索引都是从0 开始的,第1个元素的索引为0,第2 个元素的索引为1,… 依此类推; 它们也支持使用负数索引,倒数第l1个元素的索引为-1,倒数第2 个元素的索引为-2 …… 依此类推。
    列表的元素相当于一个变量,程序既可使用它的值,也可对元素赋值;元组的元素则相当于一个常量, 程序只能使用它的值,不能对它重新赋值。

2.2.2 子序列

    列表和元组同样也可使用索引获取中间一段,这种用法被称为slice(分片或切片)。slice的完整语法格式如下:
[start: end: step]
    其中start、end 两个索引值都可使用正数或负数, 其中负数表示从倒数开始。该语法表示从start 索引的元素开始(包含),到end 索引的元素结束(不包含) 的所有元素。step表示步长,因此step 使用负数没有意义。

2.2.3 加法

    列表和元组支持加法运算,加法的和就是两个列表或元组所包含的元素的总和。列表只能和列表相加;元组只能和元组相加;元组不能直接和列表相加。
    代码示例:

#计算元组相加
a_tuple =('crazyit', 340 , 5.6, 'Python ',-23)
b_tuple=('cat',34,-45,'Hello','World')
print(a_tuple+b_tuple)#输出结果:('crazyit', 340, 5.6, 'Python ', -23, 'cat', 34, -45, 'Hello', 'World')
#计算列表相加
a_list =['crazyit', 340 , 5.6, 'Python ',-23]
b_list=['cat',34,-45,'Hello','World']
print(a_list+b_list)#输出结果:['crazyit', 340, 5.6, 'Python ', -23, 'cat', 34, -45, 'Hello', 'World']

2.2.4 乘法

    列表和元组可以和整数执行乘法运算,列表和元组乘法的意义就是把它们包含的元素重复N次——N 就是被乘的倍数。
    代码示例;

a_tuple =('crazyit', 340 )
mul_tuple=a_tuple*3
print(mul_tuple)
#输出结果:('crazyit', 340, 'crazyit', 340, 'crazyit', 340)
a_list =['Python', 23 ]
mul_list=a_list*3
print(mul_list)
#输出结果:['Python', 23, 'Python', 23, 'Python', 23]

    用户可以以对列表、元组同时进行加法、乘法运算。例如:编写程序将把用户输入的日期翻译成英文表示形式。、

order_endings = ('st','nd','rd') + ('th',) * 17 + ('st','nd','rd',) +('th',) * 7 + ('st',)
print(order_endings)
day=input("请输入日期:1-31")
print(day+order_endings[int(day)-1])

    输出结果:

请输入日期:1-31
3rd

    (‘th’,) 明明只有一个元素,为何不省略逗号?这是因为(’th’)只是字符串加上圆括号,并不是元组,也就是说’(‘th’,) 和’th’是相同的。 为了表示只有一个元素的元组,必须在唯一的元组元素之后添加英文逗号。

2.2.5 in运算符

    in 运算符用于判断列表或元组是否包含某个元素。同样not in也适用。

s=(23,34,56,7,8,90,12)
print(3 not in s)
print(34 in s)

    输出结果:

True
True

2.2.6 长度、最大值和最小值

    Python 提供了内置的ten()、max()、min()全局函数来获取元组或列表的长度、最大值和最小值。在使用以上三个函数时,元组、列表的元素必须是相同类型且可以比较大小。
    代码示例:

b_list = [ 'crazyit','fkit','Python','hello']
#计算最大值(依次比较每个字符的ASCII 码值,先比较第一个字符,若相同,再比较第二个字符, 依此类推)
print(max(b_list))

    输出结果:

hello

2.2.7 序列封包和序列解包

    Python还提供了序列封包(Sequence Packing)和序列解包(Sequence Unpacking)的功能。Pytho支持以下两种赋值方式:

  • 程序把多个值赋给一个变量时, Python 会自动将多个值封装成元组。这种功能被称为序列封包。
  • 程序允许将序列(元组或列表等)直接赋值给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量个数相等)。这种功能被称为序列解包。
        代码示例:
#序列封包
vals = 4 , 7 , 8
print (vals) # (10, 20 , 30)
print(type(vals)) #<class ’ tuple ’ >
#序列解包
a_tuple= tuple(range(1, 10, 2))
print(a_tuple)
a,b,c,d,e=a_tuple
print(a,b,c,d,e)

    输出结果:

(4, 7, 8)
<class ‘tuple’>
(1, 3, 5, 7, 9)
1 3 5 7 9

    如果在赋值中同时运用了序列封包和序列解包机制,就可以让赋值运算符支持同时将多个值赋给多个变量。

x , y , z = 10 , 20 , 30
x , y , z = z . y .x
print(x, y , z) 

    在序列解包时也可以只解出部分变量,剩下的依然使用列表变量保存。为了使用这种解包方式,Python 允许在左边被赋值的变量之前添加“*”,那么该变量就代表一个列表,可以保存多个集合元素。例:

fir, *middle, last = range (10)
print(fir) # 0
print (middle) # [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7, 8]
print(last) # 9

2.3 使用列表

2.3.1 创建列表

    Python提供了一个内置的list()函数来创建列表, list()函数可用于将元组、区间(range)等对象转换为列表。示例:

a_tuple = ( 'crazyit' , 20 , 1.2)
#将元组转换成列表
a_list = list(a_tuple)
print(a_list)#输出结果:['crazyit', 20, 1.2]

    与list()对应的是, Python 也提供了一个tuple() 函数, 该函数可用于将列表、区间(range 等对象转换为元组。示例:

a_range = range(1,5)
print ( a_range) # 输出结果:range(1, 5)
#将区间转换成元组
b_tuple = tuple(a_range)
print (b_tuple) #输出结果:(1, 2, 3, 4)

2.3.2 增加列表元素

    为列表增加元素可调用列表的append()方法,该方法会把传入的参数追加到列表的最后面。
    append ()方法既可接收单个值,也可接收元组、列表等,但该方法只是把元组、列表当成单个元素, 这样就会形成在列表中嵌套列表、嵌套元组的情形。示例:

a_list = [ 'Python', 20 , - 2]
a_list.append ( ('a','b '))
print(a_list) #输出结果:['Python', 20, -2, ('a', 'b ')]

    ,为列表追加另一个列表时, Python 会将被追加的列表当成一个整体的元素,而不是追加目标列表中的元素。如果希望不将被追加的列表当成一个整体,而只是追加列表中的元素,则可使用列表的extend()方法。

a_list = [ 'Python', 20 , - 2]
a_list.extend(range(1,10,2))
print(a_list)#输出结果:['Python', 20, -2, 1, 3, 5, 7, 9]

    ,如果希望在列表中间增加元素,则可使用列表的insert()方法,使用insert()方法时要指定将元素插入列表的哪个位置。

c_list= list(range(1,6))
print(c_list) # [1, 2, 3, 4, 5]
#在索引3 处插入字符串
c_list.insert(3,'Python')
print(c_list) # 输出结果:[1, 2, 3, 'Python', 4, 5]
#在索引3 处插入元组,元组被当成一个元素
c_list.insert(3 , tuple ( 'Python' ))
print (c_list) # 输出结果:[1, 2, 3, ('P', 'y', 't', 'h', 'o', 'n'), 'Python', 4, 5]

2.3.3 删除列表元素

    删除列表元素使用del语句。del语句是Python 的一种语句,专门用于执行删除操作,不仅可用于删除列表的元素,也可用于删除变量等。使用del语句既可删除列表中的单个元素,也可直接删除列表的中间一段。代码示例:

a_list =[ 'Python', 20 , 2.4 , (3, 4 ),'hello' ]
#删除第3 个元素
del a_list[2]
print(a_list) #输出结果:['Python', 20, (3, 4), 'hello']
b_list = list (range (1 , 10))
#删除第3 个到倒数第2 个(不包含)元素,间隔为2
del b_list[2: -2 : 2]
print (b_list) #输出结果:[l , 2, 4 , 6 , 8 , 9]

    Python还提供了remove()方法来删除列表元素,该方法并不是根据索引来删除元素的,而是根据元素本身来执行删除操作的。该方法只删除第一个找到的元素,如果找不到该元素,该方法将会引发ValueError 错误。

c_list = [20,'Python', 30 , -4 ,'hello' , 3.4,20 ]
c_list.remove(20)
print(c_list)#输出结果:['Python', 30, -4, 'hello', 3.4, 20]

    列表还包含一个clear()方法,该方法用于清空列表的所有元素。代码示例:

c_list = [20,'Python', 30 , -4 ,'hello' , 3.4,20 ]
c_list.clear()
print(c_list)#输出结果:[]

2.3.4 修改列表元素

    列表的元素相当于变量,因此程序可以对列表的元素赋值,这样即可修改列表的元素。例如:

a_list = [20,'Python', 30 , -4 ,'hello' , 3.4,20 ]
a_list[2]='code'
a_list[-2]=-56
print(a_list)#输出结果:[20, 'Python', 'code', -4, 'hello', -56, 20]

    程序既可使用正数索引,也可使用负数索引。程序也可通过slice语法对列表其中一部分赋值,在执行这个操作时并不要求新赋值的元素个数与原来的元素个数相等。该操作可以更改列表元素的数量。

a_list=list(range(0,5))
a_list[2:4]=['a','b','c','d','e']
print(a_list)#输出结果:[0, 1, 'a', 'b', 'c', 'd', 'e', 4]

    对列表使用slice语法赋值时,不能使用单个值;如果使用字符串赋值,Python会自动把字符串当成序列处理,其中每个字符都是一个元素。例如:

b_list=list(range(0,5))
b_list[1:4]='China'
print(b_list)#输出结果:[0, 'C', 'h', 'i', 'n', 'a', 4]

    在使用slice语法赋值时,也可指定step参数。但如果指定了step参数,则要求所赋值的列表元素个数与所替换的列表元素个数相等。

c_list= list ( range(1, 10))
#指定step为2 ,被赋值的元素有4 个,因此用于赋值的列表也必须有4 个元素
c_list[2 : 9 : 2] = [' a ','b ','c','d ']
print(c_list)#输出结果:[1, 2, ' a ', 4, 'b ', 6, 'c', 8, 'd ']

3.3.5 列表的其他常用方法

    列表还包含如下常用方法:

  • count():用于统计列表中某个元素出现的次数。
  • index():用于判断某个元素在列表中出现的位置。
  • pop():用于将列表当成“栈”使用, 实现元素出栈功能。
  • reverse():用于将列表中的元素反向存放。
  • sort() 用于对列表元素排序。
        代码示例:
a_list = [2 , 30 ,' a ','b','Python' ,-23, 30]
#计算列表中30 出现的次数
print (a_list.count(30)) #输出结果:2
#从、在索号2到4之间, 定位元素-23出现的位置
print(a_list.index(-23,2,6))#输出结果:5

    Python 的列表并没有提供push()方法,我们可以使用append()方法末代替push() 方法实现入找操作。代码示例:

stack = []
#向栈中入栈3 个元素
stack.append ( 'fkit ' )
stack . append ( 'crazyit' )
stack . append ( 'Charlie ')
print(stack) # [ ’ fkit ’,’ crazy it ’,’ Charlie ’ ]
#第一次出栈
print(stack.pop())
print( stack) # [ ’ fkit ’,’ crazyit ’ ]
#再次出栈
print(stack . pop())
print( stack)

    输出结果:

['fkit ', ‘crazyit’, 'Charlie ']
Charlie
['fkit ', ‘crazyit’]
crazyit
['fkit ']

    reverse()方法会将列表中所有元素的顺序反转,代码如下:

b_list=list(range(1,10,2))
b_list.reverse()
print(b_list)#输出结果:[9, 7, 5, 3, 1]

如果在程序中使用print(b_list.reverse())则输出结果为:None
    sort()方法用于对列表元素进行排序。sort()方法除支持默认排序之外,还可传入key 和reverse 两个参数,而且这两个参数必须通过参数名指定。key 参数用于为每个元素都生成一个比较大小的“ 键”; reverse 参数则用于执行是否需要反转排序——默认是从小到大排序;如果将该参数设为True ,将会改为从大到小排序。

b_list = ['Python ','Swift ', 'Ruby ','Go ','Kotlin ','Erlang ']
b_list.sort(key=len)
print(b_list)#输出结果:['Go ', 'Ruby ', 'Swift ', 'Python ', 'Kotlin ', 'Erlang ']
#指定反向排序
b_list.sort(key=len , reverse=True)
print(b_list)#输出结果:['Python ', 'Kotlin ', 'Erlang ', 'Swift ', 'Ruby ', 'Go ']

    上面两次排序时都将key 参数指定为len,这意味着程序将会使用len()函数对集合元素生成比较大小的键,根据集合元素的字符串长度比较大小。

3.3.6 元组使用过程注意事项

  • 对于元组而言小括号并非必须的,只要将一组值用逗号分隔开,Python就可以将其视为一个元组。
tupl = '床前明月光','疑是地上霜','抬头望明月','低头思故乡'
print(type(tupl))

输出结果:

<class 'tuple'>
  • 如果创建的元组只包括一个元素,则需要在定义元组时,在元素后面加一个逗号。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

偷代码的Jerry

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值