python学习笔记(四):列表操作

目录

1.遍历整个列表

1.1利用for循环遍历列表

2.避免缩进错误

 2.1忘记缩进

2.2不必要的缩进

2.3遗漏了冒号

3.创建数字列表

3.1使用函数range()

3.2对数字列表执行简单的计算

3.3列表解析

4.使用列表的一部分

4.1切片

4.2遍历切片

4.3复制列表

5.元组

5.1定义元组

5.2遍历元组中的所有值

5.3修改元组变量


 

1.遍历整个列表

我们经常需要遍历列表的所有元素,对每个元素执行相同的操作。假设我们有一个魔术师名单,需要每个魔术师的名字都打印出来。为此,我们可以分别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复的代码。再如,每当名单的长度发生变化时,都必须修改代码。因此,我们可以通过使用for循环,让Python去处理这些问题:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician)

输出结果为:

alice
david
carolina

首先定义一个magicians列表,然后定义一个for循环,从magicians列表中取出一个元素,并将其存储在magician中,最后打印出magician。这样就实现了获取名单中所有名字的功能。

 

1.1利用for循环遍历列表

刚开始使用for循环时请牢记,对列表中的每个元素,都将执行循环指定的步骤,而不管列表包含多少个元素。另外,编写for循环时,对于用于存储列表中每个值的临时变量,可指定任何名称。
在for循环中,可对每个元素执行任何操作,下面对上一示例进行扩展,对每个魔术师都打印一条消息,称赞他表演精彩:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician.title() + ", that was agreat trick!")

输出结果为:

Alice, that was agreat trick!
David, that was agreat trick!
Carolina, that was agreat trick!

在for循环中,想包含多少行代码都可以。在代码行for magician in magicians 后面,每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次。因此,可对列表中的每个值执行任意次数的操作。

在for循环之后,我们通常需要提供总结性的输出或者接着执行程序必须完成的其他任务。在for循环之后,没有缩进的代码都只执行一次(即没有缩进就是退出for循环)。下面对上一示例进行扩展,对全体魔术师致谢,感谢他们精彩的表演:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician.title() + ", that was agreat trick!")
print('Thank you, eveyone. That was a great magic show!')

输出结果为:

Alice, that was agreat trick!
David, that was agreat trick!
Carolina, that was agreat trick!
Thank you, eveyone. That was a great magic show!

我们可以看到,第一条print语句针对每个魔术师重复,然后第二条print语句没有缩进,因此只执行一次。
使用for循环处理数据是一种对数据集执行整体操作的不错的方式。

 

2.避免缩进错误

Python根据缩进来判断代码行与前一个代码行的关系。在前面的示例中,向各位魔术师显示消息的代码行是for循环的一部分,因为它们缩进了。 Python通过使用缩进让代码更易读;简单地说,它要求你使用缩进让代码整洁而结构清晰。

 

 2.1忘记缩进

对于位于for语句后面且属于循环组成部分的代码行,一定要缩进。如果你忘记缩进, Python会提醒你:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)

输出结果为:

File "operate_list.py", line 3
    print(magician)
        ^
IndentationError: expected an indented block

print语句应缩进却没有缩进。 Python没有找到期望缩进的代码块时,会提醒我们哪行代码有问题。

有时候,循环能够运行而不会报告错误,但结果可能会出乎意料。试图在循环中执行多项任务,却忘记缩进其中的一些代码行时,就会出现这种情况。
例如,如果忘记缩进循环中的第2行代码(它告诉每位魔术师,他的表演很精彩),就会出现这种情况:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician)
print(magician.title() + ", that was agreat trick!")

输出结果为:

alice
david
carolina
Carolina, that was agreat trick!

我们可以看到,第二条print语句原本需要缩进,但Python发现for语句后面有一行代码是缩进的,因此它没有报告错误。最终的结果是,对于列表中的每位魔术师,都执行了第一条print语句,因为它缩进了;而第二条print语句没有缩进,因此它只在循环结束后执行一次。由于变量magician的终值为'carolina',因此只有她收到了消息“that was agreat trick”。
这是一个逻辑错误。从语法上看,这些Python代码是合法的,但由于存在逻辑错误,结果并不符合预期。如果你预期某项操作将针对每个列表元素都执行一次,但它却只执行了一次,请确定是否需要将一行或多行代码缩进。
 

2.2不必要的缩进

有时候如果你不小心缩进了无需缩进的代码行, Python可能会指出这一点:

message = "Hello Python world!"
print(message)

输出结果为:

File "hello_world.py", line 2
    print(message)
    ^
IndentationError: unexpected indent

print语句无需缩进,因为它并不属于前一行代码,因此Python将指出这种错误。
但是如果你不小心缩进了应在循环结束后执行的代码,这些代码将针对每个列表元素重复执行。在某些情况下,这可能导致Python报告语法错误,在大多数情况下,这只会导致逻辑错误,Python并不会报告。例如不小心缩进了感谢全体魔术师精彩表演的代码行,它将针对列表中的每位魔术师执行一次:

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician.title() + ", that was agreat trick!")
    print('Thank you, eveyone. That was a great magic show!')

输出结果为:

Alice, that was agreat trick!
Thank you, eveyone. That was a great magic show!
David, that was agreat trick!
Thank you, eveyone. That was a great magic show!
Carolina, that was agreat trick!
Thank you, eveyone. That was a great magic show!

这也是一个逻辑错误,与2.1节的错误类似。 Python不知道你的本意,只要代码符合语法,它就会运行。如果原本只应执行一次的操作执行了多次,请确定你是否不应该缩进执行该操作的代码。
 

2.3遗漏了冒号

for语句末尾的冒号告诉Python,下一行是循环的第一行。如果你不小心遗漏了冒号:

magicians = ['alice', 'david', 'carolina']
for magician in magicians
    print(magician)

输出结果为:

 File "e:\documents\learnPython\code\4_operate_list.py", line 2
    for magician in magicians
                            ^
SyntaxError: invalid syntax

这样将导致语法错误,因为Python不知道你意欲何为。这种错误虽然易于消除,但并不那么容易发现。
 

3.创建数字列表

在实际应用中,我们经常需要存储一组数字的集合。列表非常适合存储数字集合,而且Python提供了很多工具,可帮助你高效地处理数字列表。

 

3.1使用函数range()

Python函数range()可以让我们能够轻松地生成一系列的数字,例如:

for value in range(1,5):
    print(value)

输出结果为:

1
2
3
4

我们可以看到这个示例中打印出了数字1-4,函数range()让Python从你指定的第一个值开始数,并在你指定的第二个值停止(注意是到第二个值立即停止,并不包含第二个值)。因此要打印数字1-5,需要使用range(1,6)。

创建数字列表,可以使用函数list()将range()的结果直接转换为列表。在前一个示例中,我们打印了一系列数字。要将这些数字转换为一个列表,可以使用list():

numbers = list(range(1,6))
print(numbers)

输出结果为:

[1, 2, 3, 4, 5]

使用函数range()时,还可指定步长。例如打印10以内的奇数:

numbers = list(range(1, 11, 2))
print(numbers)

输出结果为:

[1, 3, 5, 7, 9]

使用函数range()几乎可以创建任何需要的数字集合,例如,创建一个列表,其中包含前10个整数的平方:

squares = []
for value in range(1,11):
    square = value**2 
    squares.append(square)
print(squares)

输出结果为:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

在Python中两个星号(**)表示乘方运算。上面示例中我们创建了一个空列表,然后使用函数range()遍历1-10的值。在循环中计算当前值的平方,将结果存储在square中,并将square附加在列表squares的末尾。最后循环结束,打印出列表squares。
 

3.2对数字列表执行简单的计算

在Python中还有专门处理数字列表的函数,例如:

squares = []
for value in range(1,11):
    squares.append(value**2)
print(min(squares))
print(max(squares))
print(sum(squares))

其中为了使代码更加整洁,此示例中没有使用临时变量square,而是直接将每个计算得到的值附加到列表末尾。利用min()、max()、sum()等函数计算数字列表的最小值、最大值、总和,输出结果为:

1
100
385

 

3.3列表解析

前面介绍的生成列表squares的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表。 列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。面向初学者的书籍并非都会介绍列表解析,这里之所以介绍列表解析,是因为等你开始阅读他人编写的代码时,很可能会遇到它们。
下面的示例使用列表解析创建你在前面看到的平方数列表:

squares = [value**2 for value in range(1,11)]
print(squares)

结果与你在前面看到的平方数列表相同:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

要使用这种语法,首先指定一个描述性的列表名,如squares;然后,指定一个左方括号,并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式为value**2,它计算平方值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。注意:此时的for语句末尾没有冒号。
 

4.使用列表的一部分

我们前面一直在学习如何处理列表的所有元素。其实我们还可以处理列表的部分元素——Python称之为切片。

 

4.1切片

要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样, Python在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,需要指定索引0-3,这将输出分别为0、 1和2的元素。下面的示例处理的是一个运动队成员列表:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3]) 

输出结果为:

['charles', 'martina', 'michael']

上面的示例打印列表players的一个切片,其中只包含三名队员。输出也是一个列表,其中包含前三名队员。
我们可以生成列表的任何子集,例如,要提取列表的第2~4个元素,可将起始索引指定为1,并将终止索引指定为4:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])

输出结果为:

['martina', 'michael', 'florence']

如果没有指定第一个索引, Python将自动从列表开头开始:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])

输出结果为:

['charles', 'martina', 'michael', 'florence']

要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第4个元素到列表末尾的所有元素,可将起始索引指定为3,并省略终止索引:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[3:])

输出结果为:

['florence', 'eli']

无论列表多长,这种语法都能够让我们输出从特定位置到列表末尾的所有元素。另外前面的笔记说过,负数索引返回离列表末尾相应距离的元素,因此可以输出列表末尾的任何切片。例如,要输出名单上的最后三名队员,可使用切片players[-3:]:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])

输出结果为:

['michael', 'florence', 'eli']

上述代码打印最后三名队员的名字,即便队员名单的长度发生变化,也依然如此。
 

4.2遍历切片

如果要遍历列表的部分元素,可在for循环中使用切片。在下面的示例中,我们遍历前三名队员,并打印他们的名字:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("Here are the first three players on my team:")
for player in players[:3]:
    print(player.title())

输出结果为:

Here are the first three players on my team:
Charles
Martina
Michael

在很多情况下,切片都很有用。处理数据时,可使用切片来进行批量处理;编写Web应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息。

 

4.3复制列表

我们经常需要根据既有列表创建全新的列表,此时复制列表可提供极大的帮助。
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引( [:])。这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
例如,假设有一个列表,其中包含你最喜欢的四种食品,而你还想创建另一个列表,在其中包含一位朋友喜欢的所有食品。不过,你喜欢的食品,这位朋友都喜欢,因此你可以通过复制来创建这个列表:

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]#复制列表,friend_food是新列表,只是内容复制了my_food

print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)

输出结果为:

My favorite foods are:
['pizza', 'falafel', 'carrot cake']

My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake']

首先,我们创建一个my_foods列表,然后创建一个friend_foods列表,并将my_foods复制给friend_foods。最后打印两个列表,可以看见它们的元素是相同的。
为了核实我们确实有两个列表,下面在每个列表中添加一个元素,并检查每个列表都记录了相应人员喜欢的食物:

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]#复制列表,friend_food是新列表,只是内容复制了my_food

my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)

输出结果为:

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli']

My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'ice cream']

与上一个示例一样,将my_foods的元素复制给新列表friend_foods,然后在每个列表中添加一种食物:在my_foods中添加‘cannoli’,在friend_foods中添加‘ice cream’,最后打印两个列表,可以核实这两种食物分别包含在正确的列表中。
注意,如果不使用切片,直接将列表名称复制,不会创建出全新的了列表,只是两个变量指向同一个列表,例如:

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods #将my_food赋值给friend_food,两者指向同一个列表

my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)

当我们将'cannoli'添加到my_foods中时,它也将出现在friend_foods中;同样,虽然'ice cream'好像只被加入到了friend_foods中,但它也将出现在这两个列表中。输出表明,两个列表是相同的,这并非我们想要的结果:

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

 

5.元组

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的。然而,有时候我们需要创建一系列不可修改的元素,元组可以满足这种需求。 Python将不可变的列表被称为元组。

 

5.1定义元组

元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:

dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])

输出结果为:

200
50

首先定义了元组dimensions,注意我们使用了圆括号而不是方括号。接下来,分别打印该元组的各个元素,使用的语法与访问列表元素时使用的语法相同。
下面来尝试修改元组dimensions中的一个元素,看看结果如何:

dimensions = (200, 50)

dimensions[0] = 250 

输出结果为:

Traceback (most recent call last):
  File "operate_list.py", line 4, in <module>
    dimensions[0] = 250 
TypeError: 'tuple' object does not support item assignment

代码试图修改矩形的尺寸时, Python报告错误,这正是我们希望的。

 

5.2遍历元组中的所有值

像列表一样,也可以使用for循环来遍历元组中的所有值:

dimensions = (200, 50)
for dimension in dimensions:
    print(dimension)

输出结果为:

200
50

 

5.3修改元组变量

虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组:

dimensions = (200, 50)
print("Original dimensions:")
for dimension in dimensions:
    print(dimension)
dimensions = (400, 100)
print("\nModified dimensions:")
for dimension in dimensions:
    print(dimension)

输出结果为:

Original dimensions:                                                                
200
50
Modified dimensions:
400
100

首先定义了一个元组,并将其存储的尺寸打印了出来;接下来,将一个新元组存储到变量dimensions中;然后,打印新的尺寸。这次, Python不会报告任何错误,因为给元组变量赋值是合法的。相比于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值