操作列表
任务
- 学习遍历整个列表-使用循环
遍历列表
无论列 表有多长。循环让你能够对列表的每个元素都采取一个或一系列相同的措施, 从而高效地处理任何长度的列表,包括包含数千乃至数百万个元素的列表
–可使用Python中的for 循环
for循环
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
#对于每一个位于magicians中的元素取名为magician,并在缩进行操作
#特别要注意":"符号
- 对列表中的每个元素,都将执行循环指定的步骤,而不 管列表包含多少个元素。如果列表包含一百万个元素,Python就重复执行指定的步 骤一百万次,且通常速度非常快。
- 其中magician为临时变量,是由自己指定任意名称的,当然选择描述单个列表元素的意义名称有很大裨益。在循环体中对于每个元素可使用magician来进行处理本次循环的元素
#推荐使用单复数的形式来命名,可以帮助你判断你当前处理的是单个列表元素,还是整个列表
for cat in cats:
XXXXX
for dog in dogs:
XXXXX
for item in list_of_items:
XXXXX
- 在代码行for magician in magicians :后面,每个缩进的代码行都是循环的一部分(缩进代表了c语言中的“{}”结构),将针对列表中的每个值都执行一次。
- 在结束for循环 - 方式:结束缩进,顺序执行。
- Python根据缩进来判断代码行与前一个代码行的关系。
常见缩进错误提醒
1. 忘记缩进
IndentationError: expected an indented block
#缩进错误:应为缩进的块
- 解决方法:
通常,将紧跟在for 语句后面的代码行缩进,可消除这种缩进错误。
2.忘记缩进额外的代码行
- 有时候,循环能够运行且不会报告错误,但结果可能出人意料。试图在循环中执行多项任务,却忘记缩进其中的一些代码行时,就会出现这种情况。属于逻辑错误
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(f"{magician.title()}, that was a great")
print(f"I can't wait to see, {magician.title()}.\n")
#结果最后一次输出magician为carolina,因为for循环结束后,magician的终值为carolina。
3.不必要的缩进
- 如果你不小心缩进了无须缩进的代码行,Python将指出这一点
message = "Hello Python world!"
print(message)
#IndentationError: unexpected indent
#缩进错误:不需要缩进
4.循环后不必要的缩进
- 不需要循环的语句写进循环缩进中,导致重复执行。
5.遗落了冒号
for magician in magicians
print(magician)
- 遗漏了“:”导致语法错误 循环三部曲 “**for in :”**缺一不可
数值列表
列表非常适合用于存储数字集合,而Python提供了很多工具,可帮助你高效地处理 数字列表
1.函数range(value1,value2)
函数range() 让你能够轻松地生成value1(包括)到value2(不包括)的一系列数。“[ )” 是一种左闭右开的中间的数值
for value in range(1, 5):
print(value)
#输出:
#1
#2
#3
#4
- 要打印数1~5,就需要使用range(1,6)
for value in range(1, 6):
print(value)
- 注意:
1.range(6) 当函数range()只给定一个参数时,默认从0开始,即[0,6)
生成0,1,2,3,4,5
2.range(0,6,2) 第三个参数为步长,python将根据步长来生成数,默认为1,range(0,6,2) 即生成了0,2,4。range(1,6,2):生成1,3,5
提升:创建1-10的平方数集
squares = []
for i in range(1,11):
square = i*i #或者num = i**2 即i的平方
squares.append(square)
print(squares)
#输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#简化
squares = []
for i in range(1,11)
squares.append(i**2)
print(squares)
2.对数字列表执行简单的统计计算函数
有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的 最大值、最小值和总和
digits = [1,5,6,3,4,8,9,7]
max(digits)
min(digits)
sum(digits)
3.列表解析
列表解析让你只需编写一 行代码就能生成如列表squares的列表 。
squares=[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表解析:
squares = [value**2 for value in range(1, 11)]
print(squares)
#要使用这种语法,首先指定一个描述性的列表名,如squares 。然后,指定一个左方括号,并定义一个表达式,用于生成要存储到列表中的值。在这个示例中,表达式为value**2 ,它计算平方值。接下来,编写一个for 循环,用于给表达式提供值,再加上右方括号。在这个示例中,for 循环为for value in range(1,11),它将值1~10提供给表达式value**2 。请注意,这里的for 语句末尾没有冒号。
- 先执行for value in range(1,11) 生成的每一个value值都会value**2放进列表中,列表中的个数取决于range()中生成的个数
- 在for前面可以在生成的数的关系运算 且for循环没有“:”号。
4.列表切片
在python中你还可以处理列表的部分元素,称之为 切片 用符号 “:”
- 要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range() 一样,Python在到达第二个索引之前的元素后停止。要输出列表中的前三个元素, 需要指定索引0和3,这将返回索引为0、1和2的元素。
num = [i for i in range(0,101)]
print(num[50:101])
#输出50-100
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
#输出['charles', 'martina', 'michael']
print(players)
#并不会改变原列表,除非赋值
- 你可以生成列表的任意子集。
例如,如果要提取列表的第二、第三和第四个元素, 可将起始索引指定为1 ,并将终止索引指定为4
- 如果没有指定第一个索引,Python将自动从列表开头开始
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])
#输出['charles', 'martina', 'michael', 'florence']
- 同理,不指定表尾索引,Python将自动从列表表尾结束。
- 甚至,根据负数索引可指定最后三个元素,或者最后两个不要
print(players[-3:])
#输出['michael', 'florence', 'eli']
print(players[:-2])
#输出['charles', 'martina', 'michael']
- 注意 可在表示切片的方括号内指定第三个值。这个值告诉Python在指定范围 内每隔多少元素提取一个。
players = ['charles', 'martina', 'michael', 'florence']
print(players[::2])
#输出 ['charles', 'michael']
5.遍历切片列表
如果要遍历列表的部分元素,可在for 循环中使用切片。
players = ['charles', 'martina', 'michael']
for player in players[1:]:
print(player)
#输出['martina', 'michael']
遍历前两名
players = ['charles', 'martina', 'michael']
for player in players[:2]:
print(player.title)
#输出['charles', 'martina']
列表的复制
经常需要根据既有列表创建全新的列表,要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索 引([:] )。这让Python创建一个始于第一个元素、终止于最后一个元素的切片, 即整个列表的副本。
players = ['charles', 'martina', 'michael']
players2 = players
players.append("AAAA")
players2.append("BBBBB")
print(players)
print(players2)
#输出 ['charles', 'martina', 'michael', 'AAAA', 'BBBBB']
# ['charles', 'martina', 'michael', 'AAAA', 'BBBBB']
- 可见,列表的复制不能简单的相等
players2 = players时只是将同一个地址分给了两个变量,即两个变量指向同一个内存地址。
因此修改任何一个列表都会导致这片空间所存储的数据发生变化。
以下是几种复制的方式:
方法一:使用切片操作符[:]
original_list = [1, 2, 3, 4, 5]
copied_list = original_list[:]
方法二:使用列表的copy()方法
original_list = [1, 2, 3, 4, 5]
copied_list = original_list.copy()
方法三:使用list()函数
original_list = [1, 2, 3, 4, 5]
copied_list = list(original_list)
方法四:使用循环遍历原始列表,并将元素逐个添加到一个新的列表中
original_list = [1, 2, 3, 4, 5]
copied_list = []
for item in original_list:
copied_list.append(item)
以上四种方法对于列表中的元素是可变对象(如字典或列表),那么这些方法将复制引用,而不是创建新的对象
players = [['charles', 'martina'], 'michael']
#列表中包含列表
players2 = players[:]
#此时上述方法对于第二层的列表即['charles', 'martina']是采用的复制引用,不是副本
players[0].append("AAAA")
players2[0].append("BBBBB")
print(players)
print(players2)
#[['charles', 'martina', 'AAAA', 'BBBBB'], 'michael']
#[['charles', 'martina', 'AAAA', 'BBBBB'], 'michael']
- 解决方法
import copy
players = [['charles', 'martina'], 'michael']
players2 = copy.deepcopy(players)
players[0].append("AAAA")
players2[0].append("BBBBB")
print(players)
print(players2)
#使用copy包中的深度复制方法即可