2020年4月9日 第四章 序列-2

第四章 序列-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)列表不能作为字典的键,而元组则可以。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容