第四章 序列-2
4.3 列表3
初识列表
- 列表的创建
- 访问列表元素与切片
列表的遍历
- 直接遍历
- 利用索引遍历
- 利用枚举遍历
列表的常用方法
- 增加元素
- 删除
- 排序
- 复制列表
列表的常用统计与计算函数
- 统计函数
- 计算函数
初识列表
列表(list)是包含0个或多个对象引用的有序序列,并且是Python中内置的可变序列,它提供了灵活多变的数据存储方案。
>>> favourite_fruits=["apple", "banana","pear","peach"]
>>> luck_numbers=[7,3,12,36,[9,11]]
>>> friends=["王芳",18, "李想",17, "张小若",19]
>>> ['p','y','t','h','o','n']
列表的创建
>>> list1=[ ] #创建空列表
>>> list2=[98,80,75,90,65,82] #创建数值元素的列表
>>> ["hello","world","!"]#创建包含字符串元素的列表
>>> list3=[x for x in range(5)] #列表解析创建列表[0, 1, 2, 3, 4]
# 用list( )函数将其他类型数据转换为列表
>>> list4=list(range(10, 20, 2)) #转换后的列表为[10, 12, 14, 16, 18]
>>> list5=list("Python")#转换后的列表为['p', 'y', 't', 'h', 'o', 'n']
>>> list6=list(('h', 'e', 'l', 'l', 'o')) #转换后的列表为['h', 'e', 'l', 'l', 'o']
访问列表元素与列表切片
>>> animals=["cat","dog","monkey","horse","spider","frog"]
>>> animals[0]
'cat'
>>> animals[len(animals)-1]
' frog '
正向索引 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
"cat" | "dog" | "monkey" | "horse" | "spider" | "frog" | |
反向索引 | -6 | -5 | -4 | -3 | -2 | -1 |
>>> animals=["cat","dog","monkey","horse","spider","frog"]
>>> animals[3:] #返回列表中索引值为3到最后一个元素的所有
元素组成的列表
['horse', 'spider', 'frog']
>>> animals[1:3] #返回列表中索引值为1到索引值为3(不包含)的元素组成的列表
['dog', 'monkey']
>>> animals[:] # 返回原列表的副本
['cat', 'dog', 'monkey', 'horse', 'spider', 'frog']
>>> animals=["cat","dog","monkey","horse","spider","frog"]
>>> animals[-1] #返回列表中索引为-1的元素
'frog'
>>> animals[-6:-3] #返回列表中前三个元素组成的新列表
['cat', 'dog', 'monkey']
# 嵌套列表
>>> list1=[['张小小',20],['王小瞳',19],['李焕',18]]
>>> list1[1]
['王小瞳', 19]
>>> list1[1][0]
'王小瞳'
>>> list1[0:2]
[['张小小', 20], ['王小瞳', 19]]
>>> list1[1][:]
['王小瞳', 19]
列表的遍历
任务:将中国的四大名著的书名存储在一个列表中,再遍历列表将四大名著的书名打印出来。
【1】 直接遍历列表元素
格式:
for <元素(变量)> in <列表>:
print(<元素(变量)>)
novels=['西游记','水浒','三国演义','红楼梦']
for item in novels:
print(item)
运行结果
西游记
水浒
三国演义
红楼梦
【2】 利用索引遍历列表元素
格式:
for <索引> in range(<列表长度>):
print(<列表[索引]>)
novels=['西游记','水浒','三国演义','红楼梦']
for i in range(len(novels)):
print(novels[i])
运行结果
西游记
水浒
三国演义
红楼梦
【3】 利用枚举遍历列表的索引和对应的元素
for <索引值> ,<元素> in enumerate(<列表>):
print(<索引值>,<元素>)
novels=['西游记','水浒','三国演义','红楼梦']
for i , item in enumerate(novels):
print(i,item)
运行结果
0 西游记
1 水浒
2 三国演义
3 红楼梦
【4】 列表解析
格式:
[<表达式> for <列表中元素1> in <可迭代对象1>
for <列表中元素2> in <可迭代对象2>
…
for <列表中元素n> in <可迭代对象n>
if <条件表达式>]
>>> a=[ ]
>>> for i in range(11):
>>> if i%2==0:
>>> a.append(i)
>>> a
[0, 2, 4, 6, 8, 10]
#代码优化
>>> a=[i for i in range(11) if i%2==0]
>>> a
[0, 2, 4, 6, 8, 10]
>>> [x for x in range(20)]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
>>> [x **2 for x in range(10) if x%2==0]
[0,4,16,36,64]
>>> [x+y for x in range(3) for y in range(3)]
[0, 1, 2, 1, 2, 3, 2, 3, 4]
>>> word = "solidarity"
>>> vowels = "aeiou"
>>> [i for i in word if i in vowels]
['o', 'i', 'a', 'i']
列表的常用方法
【1】向列表增加元素
#(1) list1.append(x) 在列表list1末尾增加一个元素x
>>> list1=[1,2,3]
>>> list1.append(4)
>>> list1
[1,2,3,4]
>>> list1.append(["a","b"])
>>> list1
[1,2,3,4,['a','b']]
#(2) list1.extend(list2) 在列表list1末尾增加列表list2中的元素
>>> list1=[1,2,3]
>>> list1.extend([4])
>>> list1
[1,2,3,4]
>>> list1. extend(["a","b"])
>>> list1
[1,2,3,4,'a','b']
#(3) list1.insert(i,x) 在列表list1索引为i的位置增加元素x
>>> list1=[1,2,3]
>>> list1.insert(3,4)
>>> list1
[1,2,3,4]
【试一试】向列表增加元素
>>> novels,nove1s1=["西游记","吴承恩"],["水浒","施耐庵"]
>>> novels2,novels3=["三国演义","罗贯中"],["红梦梦","曹雪芹"]
>>> novels.append(novels1)
>>> novels
['西游记', '吴承恩', ['水浒', '施耐庵']]
>>> novels.extend(novels2)
>>> novels
['西游记', '吴承恩', ['水浒', '施耐庵'], '三国演义', '罗贯中']
>>> novels.insert(0,novels3)
>>> novels
[['红梦梦', '曹雪芹'], '西游记', '吴承恩', ['水浒', '施耐庵'], '三国演义', '罗贯中']
【2】列表的删除
list1=[0,1,2,3,4,5,6,7,8,9]
#(1) del list1[i] 删除列表list1的索
引为i位置的元素
>>> del list1[0]
>>> list1
[1, 2, 3, 4, 5, 6, 7, 8, 9]
#(2) del list1[i:j:k] 删除列表list1第i到第j(不包括j)索引位置以K为步长的元素
>>> del list1[0:8:2]
>>> list1
[1,3,5,7,9]
list1=[0,1,2,3,4,5,6,7,8,9,4]
#(3) list1.remove(x) 删除列表list1中出现的第一个x元素
>>> list1.remove(4)
>>> list1
[0, 1, 2, 3, 5, 6, 7, 8, 9,4]
#(4) list1.clear( ) 删除列表list1中的所有元素
>>> list1.clear()
>>> list1
[ ]
list1=[0,1,2,3,4]
#(5) list1.pop(i) 返回列表list1 中索引为i位置的元素并删除该元素
list1.pop( ) 返回列表list1中最后一个元素并删除该元素
>>> list1.pop(2)
2
>>> list1
[0,1,3,4]
>>> list1.pop()
4
>>> list1
[0,1,3]
【3】列表的排序
#(1)list1.reverse( ) 将列表list1中的元素反转
>>>list1=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
>>> list1.reverse()
>>> list1
['Sunday', 'Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']
#(2) list1.sort(key=None,reverse=False ) 若省略参数,对列表list1中的元素按升序排序;若参数reverse=True,则按降序排序;key指定排序规则
>>> list1.sort()
>>> list1
['Friday', 'Monday', 'Saturday', 'Sunday', 'Thursday', 'Tuesday', 'Wednesday']
>>> list1.sort(reverse=True)
>>> list1
['Wednesday', 'Tuesday', 'Thursday', 'Sunday', 'Saturday', 'Monday', 'Friday']
>>> list1.sort(key=len)
>>> list1
['Friday', 'Monday', 'Sunday', 'Tuesday', 'Saturday', 'Thursday', 'Wednesday']
【4】列表的复制
#list1.copy( )复制生成一个包括list1中所有元素的新列表
>>> list1=[1,2,3,4]
>>> list3=list1
>>> list2=list1.copy( )
>>> list1
[1, 2, 3, 4]
>>> list2
[1,2,3,4]
>>> list3
[1,2,3,4]
>>> id(list1)
53290824
>>> id(list2)
53285704
>>> id(list3)
53290824
>>> list1=[1,2,3,4]
>>> list3=list1
>>> list2=list1.copy( )
有助于深入理解列表的存储机制
id:53290824
list1 → 11002301 → 1 ← 11002301 ← list2
list3 → 11452323 → 2 ← 11452323
29452324 → 3 ← 29452324
36457423 → 4 ← 36457423
【例4-3】定义一个保存世界人口数量前六位国家的列表,在列表末尾增加尼日利亚、孟加拉国、俄罗斯和墨西哥,使其显示世界人口排名前十的国家。然后将墨西哥从列表中删除,并将列表的国家按人口数量的升序显示
#E4-3.py
country=['中国','印度','美国','印度尼西亚','巴西','巴基斯坦']
country.extend(['尼日利亚','孟加拉国','俄罗斯','墨西哥'])
country.pop( )
country.reverse( )
print(country)
运行结果
['俄罗斯', '孟加拉国', '尼日利亚', '巴基斯坦', '巴西', '印度尼西亚', '美国', '印度', '中国']
【试一试】从键盘任意输入8个英文单词,将其中以非元音字母开头的单词放入列表中,最后输出列表
#方法1
s="aeiou"
ls=[ ]
for i in range(8):
words=input("请输入一个单词:")
if words.lower( )[0] not in s:
ls.append(words)
print("非元音开头的单词有:",ls)
运行结果
请输入一个单词:hello
请输入一个单词:exclent
请输入一个单词:hard
请输入一个单词:work
请输入一个单词:our
请输入一个单词:bee
请输入一个单词:an
请输入一个单词:good
非元音开头的单词有: ['hello', 'hard', 'work', 'bee', 'good']
#方法2
s="aeiouAEIOU"
ls=[ ]
for i in range(8):
words=input("请输入一个单词:")
if words[0] not in s:
ls.append(words)
print("非元音开头的单词有:",ls)
运行结果
请输入一个单词:hello
请输入一个单词:exclent
请输入一个单词:hard
请输入一个单词:work
请输入一个单词:our
请输入一个单词:bee
请输入一个单词:an
请输入一个单词:good
非元音开头的单词有: ['hello', 'hard', 'work', 'bee', 'good']
列表的统计与计算函数
若 list1=[2,4,6,8,10,2]
#(1) list1.count(x)返回元素x在列表list1中的出现次数
>>> list1.count(2)
2
#(2) list1.index(x) 返回元素x在列表list1中首次出现的索引位置
>>> list1.index(2)
0
#(3) sum(list1) 统计数值列表list1中各元素的和
>>> sum(list1)
3232
若 list1=[2,4,6,8,10,2]
#(4) len(list1) 返回列表list1的长度
>>> len(list1)
6
#(5) max(list1) 返回列表list1中元素的最大值
>>> max(list1)
10
#(6) min(list1) 返回列表list1中元素的最小值
>>> min(list1)
2
【例4-4】 新建程序文件E4-4.py,定义一个保存10名学生计算机课成绩的列表,统计出10名学生的平均成绩,并统计得100分的人数。
#E4-4.py
sc=[90,78,100,92,86,100,79,83,62,93]
print("平均成绩为:")
print(sum(sc)/len(sc))
print("得100分的人数为:")
print(sc.count(100))
运行结果
平均成绩为:
86.3
得100分的人数为:
234
【试一试】 读程序,分析程序的运行结果
from random import *
num=eval(input("请输入一个大于等于3的数"))
listRand=[ ]
for i in range(num):
rand=round(uniform(0,100),2)
listRand.append(rand)
print(listRand)
print(choice(listRand)) #从列表中随机返回一个元素
print(sample(listRand,2)) #从列表中随机返回由2个元素组成的列表
print(max(listRand))35
4.4元组及元组操作
- 元组(tuple)是Python中另一个重要的序列结构,它是包含 0 个或多个元素的不可变序列类型。
- 在形式上,元组的所有元素通常放在一对"( )"中,两个相邻元素间使用","分隔。例如:
tuple1=(10,20,30)
或tuple1=10,20,30
省略()
【1】 创建元组37
>>>num=(2,6,8,12,35,68,96)
>>>poets=('李白','杜甫','白居易','王维','苏轼')
>>>tup=(("屠呦呦",85),["诺贝尔奖","青蒿素"])
>>>name=("Mary",)
>>>t1=tuple(range(1,10,2))
>>> t1
(1,3,5,7,9)
>>>t2=tuple("hello")
>>> t2
('h', 'e', 'l', 'l', 'o')
【2】 元组的访问4.3
>>>poets=('李白','杜甫','白居易','王维','苏轼')
>>> poets[1]="孟浩然" #元组不可更改其中的元素
TypeError: 'tuple' object does not support item assignment
>>> poets([0]) #返回元组中第0个元素的值
'李白'
>>> poets[1:3] #元组切片
('杜甫', '白居易')
>>> tup2=num+name #元组相加(相连)后返回一个 新的元组
(2,6,8,12,35,68,96, "Mary")
【3】 删除元组
>>> del tup2 #删除元组tup2
>>> tup2
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
tup2
NameError: name 'tup2' is not defined
【4】 元组的其他操作
>>> tup3=(10,20,30,40,50)
>>> sum(tup3)
150
>>> max(tup3)
50
>>> min(tup3)
10
>>> len(tup3)
5
>>> 20 in tup3
True
>>> 60 not in tup3
True
>>> tup3.index(30)
2
>>> tup3.count(10)
1
【5】 元组与列表的区别
(1)列表属于可变序列,它的元素可以随时修改或者删除;元组属于不可变序列,其中的元素不可以修改。
(2)列表可以使用append( )、extend( )、insert( )、remove( )和pop( )等方法实现添加和修改列表元素,而元组没有这几个方法,所以不能向元组中添加、修改或删除元素。
(3)元组比列表的访问和处理速度快,所以当只需要对其中的元素进行访问,而不进行任何修改时,建议使用元组。
(4)列表不能作为字典的键,而元组则可以。