十四、列表的相关知识
这一部分来回顾一下最近学习到的关于列表的知识。
1、列表的定义以及元素的获取
定义:list列表类似于其它语言的数组,用来存储不同的数据类型。 这里的数组可以是数字的组合、字母的组合,也可以是字符串的组合,也可以是这些类型的混合(后续用一个例子来说明可以将这些类型混合来组成一个列表)。
列表的符号:[ ] ,只要是[ ]符号,python就认为是列表。
演示代码如下:
names = ['tom', 'jerry', 'lucy', 'superman', 'ironman']
computer_brands = []
print(id(names))
print(id(computer_brands))
运行结果如下:
2293503892928
2293503904000
解释:
两个列表的地址都可以打印,证明只要声明列表就会被分配内存地址,即使是空列表也会被分配地址
2、元素的获取与使用:通过下标 索引
(1)获取列表的长度
演示代码如下:
names = ['tom', 'jerry', 'lucy', 'superman', 'ironman']
print(len(names)) # len()可以获取字符串以及列表的长度
print(names[len(names) - 1]) # 要-1,否则会报错,索引错误
'''
print(names[5]) 会报错,因为总长度是5,但是索引最大是4
IndexError: list index out of range
'''
运行结果如下:
5
ironman
(2)元素的获取
演示代码如下:
names = ['tom', 'jerry', 'lucy', 'superman', 'ironman']
'''
names = ['tom', 'jerry', 'lucy', 'superman', 'ironman']
0 1 2 3 4
-5 -4 -3 -2 -1
'''
print(names[0])
print(names[-5])
print(names[1])
# 获取最后一个元素
print(names[-1])
print(names[4]) # 列表当中总共5个元素,但是其索引是从0到4,而不是1到5
# 获取第一个元素
print(names[0])
print(names[-5])
运行结果如下:
tom
tom
jerry
ironman
ironman
tom
tom
(3)列表元素的遍历
演示代码如下:
names = ['tom', 'jerry', 'lucy', 'superman', 'ironman']
for name in names:
print(name) # 列表也可以放进for...in 循环中进行遍历 ,与字符串的遍历类似
运行结果如下:
tom
jerry
lucy
superman
ironman
演示代码如下:
# 查询names里面有没有超人
for name in names:
if name == 'superman':
print('names里面有超人')
break
else:
print('names里面没有超人')
# 更简便的方法: 't' in 'they'-----> True
if 'superman' in names: # 判断有没有
print('names里面有超人')
else:
print('names里面没有超人')
运行结果如下:
names里面没有超人
names里面没有超人
names里面没有超人
names里面有超人
names里面有超人
3、列表的增删改查
(1)列表元素的增加
就先从列表元素的增加开始复习回顾吧,在刚开始提到列表的时候,就提到也验证过即使是空列表也是占内存地址的,这一部分来了解和学习一下列表元素的添加就可以对一个空列表进行操作啦。列表可以认为是临时的小数据库,既然是小数据库,那么小数据库是完全可以进行增删改查这一系列的操作的。(为什么说是临时的呢?列表是从内存中开辟的,电脑关机或者回收一下就不存在了,所以说是临时的)。在前面学习字符串的时候知道了字符串的切片和一些内置函数,那么列表又是否有内置函数呢?
回顾一下列表元素的增加时经常用到的三个函数:
- append(末尾追加)
- extend(会将字符串拆开,适合一次性添加多个元素)
- insert(指定位置插入)
example 1 -----append的用法
演示代码如下:
fruits = []
f = input('请输入你喜欢的水果:')
fruits.append(f)
print(fruits)
运行结果如下:
请输入你喜欢的水果:apple
['apple']
下面设计一个循环结构,产生一个拥有更多元素的列表
演示代码如下:
fruits = []
while True:
f = input('请输入你喜欢的水果:') # 请输入你喜欢的水果:mango/banana/grape/pear/peach
fruits.append(f)
if f == 'quit':
break
print(fruits)
运行结果如下:
运行结果如下:
请输入你喜欢的水果:pear
请输入你喜欢的水果:mango
请输入你喜欢的水果:quit
['pear', 'mango', 'quit']
这个存在着一定的问题,输入quit也会被放入列表当中,我们并不期待这样的运行结果,怎么办呢?改变一下语序就可以啦
修正代码:
fruits = []
while True:
f = input('请输入你喜欢的水果:') # 请输入你喜欢的水果:mango/banana/grape/pear/peach
if f == 'quit':
break
fruits.append(f)
print(fruits)
运行结果如下:
请输入你喜欢的水果:mango
请输入你喜欢的水果:banana
请输入你喜欢的水果:grape
请输入你喜欢的水果:pear
请输入你喜欢的水果:peach
请输入你喜欢的水果:quit
['mango', 'banana', 'grape', 'pear', 'peach']
example 2 -----extend的用法
演示代码如下:
fruits = ['apple']
f = input('请输入你喜欢的水果:')
fruits.extend(f)
print(fruits)
运行结果如下:
请输入你喜欢的水果:banana
['apple', 'b', 'a', 'n', 'a', 'n', 'a']
可见:extend把字符串给拆开了,之后可以用一个列表来做演示,可以把一个列表添加到另外一个列表中去,相当于列表的合并。
演示列表的合并:
fruits = ['apple']
fs = ['pear', 'mango', 'banana']
fruits.extend(fs)
print(fruits)
运行结果:['apple', 'pear', 'mango', 'banana']
将列表fs里面的内容拆开加到列表fruits当中
符号+ 在字符串中表示拼接,那运用在列表当中是否可以呢?
fruits = ['apple']
fs = ['pear', 'mango', 'banana']
fruits = fruits + fs
print(fruits)
运行结果:
['apple', 'pear', 'mango', 'banana']
运行结果显示 符号+ 也可以用于列表的合并
example 3 -----insert的用法
fruits = ['apple', 'pear', 'mango', 'banana']
fruits.insert(1, 'grape') # 1表示插入在列表当中时的位置,'grape'表示插入的内容
print(fruits)
'''运行结果:['apple', 'grape', 'pear', 'mango', 'banana']'''
(2)列表元素的删除和修改
代码如下:
computer_brands = ['hp', 'dell', 'thinkpad', 'lenovo', 'mac', '神州']
# 先来介绍一下列表的改吧
print(computer_brands)
print(computer_brands[-1])
computer_brands[-1] = 'HASEE' # 将最后那个中文元素改为英文
print(computer_brands) # 成功修改了该列表中的参数
# 可见修改列表当中的元素的步骤如下:
# 1、找到需要修改的元素的索引(下标)
# 2、通过等号赋值
# 3、新的元素覆盖原来的元素
运行结果:
['hp', 'dell', 'thinkpad', 'lenovo', 'mac', '神州']
神州
['hp', 'dell', 'thinkpad', 'lenovo', 'mac', 'HASEE']
再来看一段代码:
computer_brands = ['hp', 'dell', '支持华为', 'lenovo', 'mac', '神州']
for brand in computer_brands:
if '华为' in brand:
brand = 'HUAWEI'
print(computer_brands)
运行结果:
经过这段代码的操作,发现这并没有改变列表的元素,这是什么原因呢?
因为这一番操作改变的是brand变量的值,而对列表没有任何影响 只有通过索引,下标才会对列表的增删改产生影响
['hp', 'dell', '支持华为', 'lenovo', 'mac', '神州']
如何通过下标来对列表进行修改呢?代码如下:
for i in range(len(computer_brands)):
# i是0,1,2,3...是列表元素索引
if '华为' in computer_brands[i]:
computer_brands[i] = 'HUAWEI'
break # 后面没有符合条件的元素了,直接break,不再对后续字符串进行遍历
print(computer_brands) # 通过列表的索引对列表进行修改,运行成功
'''只要更改就要用到下标,只要用到下标就要用到 for i in range(len(computer_brands)): 而不应该用for brand in computer_brands:'''
运行结果:
['hp', 'dell', 'HUAWEI', 'lenovo', 'mac', '神州']
在这一段代码的基础上做删除操作,代码如下:
# 删除del是delete的缩写
del computer_brands[2]
print(computer_brands)
# 删除任何一个元素都是通过下标找到位置才进行删除的
运行结果:
['hp', 'dell', 'lenovo', 'mac', '神州']
接下来来做一个操作,电脑品牌中只要是hp,mac都要删除掉,怎么写代码呢?
for i in range(len(computer_brands)):
if 'hp' in computer_brands[i] or 'mac' in computer_brands[i]:
del computer_brands[i]
print(computer_brands)
这段代码报索引错误。不要一边删除一边遍历,在进行第一次删除操作,操作成功以后,长度就发生改变啦,在后续遍历的时候就会报索引错误。
l = len(computer_brands)
for i in range(l):
if 'hp' in computer_brands[i] or 'mac' in computer_brands[i]:
del computer_brands[i]
l -= 1
print(computer_brands)
同样会报错,索引错误。for i in range(l): 这里l值进循环时已经产生完那个值了,再进行l-=1也没有意义了,
再加上break也不可以,因为这样的话删除完惠普就退出循环了
考虑用一下while循环试试
computer_brands = ['hp', 'dell', 'HUAWEI', 'lenovo', 'mac', 'HASEE']
print('------------删除-----------')
l = len(computer_brands)
i = 0
while i < l:
if 'hp' in computer_brands[i] or 'mac' in computer_brands[i]:
del computer_brands[i]
l -= 1
i += 1
print(computer_brands)
运行结果如下:运行成功!!!
------------删除-----------
['dell', 'HUAWEI', 'lenovo', 'HASEE']
4、关于列表修改的一个例子
删除存在于原列表中的字符
words =[‘hello’,‘good’,‘apple’,‘world’,‘digit’,‘alpha’]
提示输入一个单词比如hello,如果输入的单词在列表中则删除,最后打印删除后的列表
words = ['hello', 'good', 'apple', 'world', 'digit', 'alpha']
w = input('请输入一个单词:')
# 方式1-------------------------------------------------------------------------------------
for word in words: # 这里的in判断内容有没有在列表中存在(即:字符串有没有在列表中)
if w in word: # 这里的in判断输入的单词w有没有在word字符串中出现 此处如果把in改为==就变成了更为精确的比较
# in包含==这个情况(详情见下面注释)
print('存在此单词')
break
运行结果如下:
请输入一个单词:go
存在此单词
如果想要更精确地判断是否存在那个一模一样的单词,可以将in换成==,但实际==是被包含在in的情况当中的。
if 'good' == 'good': # ==比较的是内容 'good' 和 'good'
print('相等')
if 'good' in 'good': # in 是运算符,应用在字符串判断中
print('相等或者包含')
运行结果如下:
相等
相等或者包含
注释:
in包含==这个情况
eg:
'go' in 'good'----------->True
'good' in 'good'----------->True
==比较的是内容,内容一模一样才会执行下一句
if…in是一个布尔条件不是循环,它只是判断完’good’是否在列表[‘goods’,‘good’,‘abc’,‘aaa’]出现了就会打印
for…in这是循环,循环进行条件的判断
演示代码:
i = 1
if 'good' in ['goods', 'good', 'abc', 'aaa']:
print('包含---------》', i)
i += 1
# 猜测一下结果是什么
# A.1 B.2 C.1,2
i = 1
for w in ['goods', 'good', 'abc', 'aaa']:
# w=goods w=good w=abc w=aaa
print('good' in w) # True True False False
print('---------', i)
i += 1
运行结果如下:
包含---------》 1
True
--------- 1
True
--------- 2
False
--------- 3
False
--------- 4
说了那么多,前面的都是铺垫。下面正式进入对删除存在于原列表中的字符的代码的编写
words = ['hello', 'goods', 'gooo', 'world', 'digot', 'alpgo']
w = input('请输入一个单词:')
i = 0
l = len(words)
while i < l:
if w in words[i]:
del words[i]
l -= 1
i += 1
print(words)
运行结果如下:
请输入一个单词:go
['hello', 'gooo', 'world', 'alpgo']
竟然出现了漏删的情况,来分析一下是什么原因导致的。
换一个新的列表words = ['hello', 'good', 'apple', 'world', 'digot', 'alpgo'],检验一下 发现运行结果如下:
请输入一个单词:go
['hello', 'apple', 'world', 'alpgo']
出现了漏删的情况,这是为什么嘞?
--------------------------------------------------------------------------------------------------------------------------------
分析:列表的长度是6
i=0
i<6
'go' in 'hello'---------> False
故执行i += 1-------------->i = 1
1<6
'go' in 'good'(words[1])---------> True
del words[1]
l-=1 -----------------------> l=5
list=['hello', 'apple', 'world', 'digot', 'alpgo']
执行i += 1-------------->i = 2
2<5
'go' in 'world'---------> False
执行i += 1-------------->i = 3
3<5
'go' in 'digot'(words[3])---------> True
del words[3]
l-=1 -----------------------------> l=4
i +=1------------------------------>i=4
4<4-------------------------------->False
不满足while进入循环的条件
则结束循环执行最后一句print(words)
此时list长度为4
请输入一个单词:go
['hello', 'gooo', 'world', 'alpgo']
于是就产生了漏删的情况
修改代码如下: 在if结构中加入了continue
words = ['hello', 'goods', 'gooo', 'world', 'digot', 'alphago']
w = input('请输入一个单词:')
i = 0 # 表示下标
l = len(words) # 5
while i < l: # i<5
if w in words[i]:
del words[i]
l -= 1
# i-=1
continue
i += 1
print(words)
运行结果如下:运行成功!!!
请输入一个单词:go
['hello', 'world']
分析:(相当于每一次都从被删掉的那个字符串之后的字符串开始判断,以避免漏删的情况)
i=0
i<6
'go' in 'hello'---------> False
故执行i += 1-------------->i = 1
1<6
'go' in 'good'(words[1])---------> True
del words[1]
l-=1 -----------------------> l=5
list= ['hello', 'gooo', 'world', 'digot', 'alphago']
continue
i=1
1<5
'go' in 'gooo'---------> True
del words[1]
l -= 1----------------------》l=4
list=['hello', 'world', 'digot', 'alphago']
continue
i=1
1<4
'go' in 'world'(words[1])---------> False
故执行i += 1-------------->i = 2
i = 2
2<4
'go' in 'digot'---------> True
del words[2]
l-=1 -----------------------------> l=3
list=['hello', 'world', 'alphago']
continue
i = 2
2<3
'go' in 'alphago'---------> True
del words[2]
l-=1 -----------------------------> l=2
list=['hello', 'world']
continue
i = 2
2<3-----------------------------》False
结束循环 打印列表