操作列表(python)




文章目录

  • 操作列表(python)
  • 1. 遍历整个列表
  • 深入研究循环
  • 2. 忘记缩进
  • 不必要的缩进
  • 3. 创建数值列表
  • 使用函数``range()``
  • 使用``range()创建数字列表``
  • 对数字列表执行简单的统计计算
  • 列表解析
  • 使用列表的一部分
  • 切片
  • 遍历切片
  • 复制列表
  • 元组``元素不可变的列表(但是整体可以重新定义)``
  • 定义元组
  • 遍历元组中的所有值
  • 修改元组变量



1. 遍历整个列表

需要对列表中的每个元素都执行相同的操作时,可使用python中的for循环
下面使用for循环来打印魔术师的所有名字:

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

上述代码中定义一个for循环,这行代码让python从列表magicians中取出一个名字,并将其与变量magician相关联。最后,让python打印前面赋给magician的名字。

深入研究循环

编写for循环时,可以给依次与列表中每个值相关联的临时变量指定任意名称。然而,选择描述单个列表元素的有意义名称大有脾益。例如,对于小猫列表、小狗列表和一般性列表,像下面这样编写for循环的第一行代码时不错的选择:

for cat in cats:
for dog in dogs:
for item in list_of_items:

这些命名约定有助于你明白for煦暖中将每个元素执行的操作。使用单数和复数名称,可帮助你判断代码段处理的是单个列表元素还是整个列表。


2. 忘记缩进

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

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

函数调用print()应缩进却没有缩进。python没找到期望缩进的代码块时,会让你知道哪行代码有问题:

File "magicians.py", line3
	print(magician)
IndentationError: expected an indented block

不必要的缩进

如果不小心缩进了无须缩进的代码行,python将指出这一点:

>>> message  = "Hello python world!"
>>> 	print(message)

函数调用print()无须缩进,因为它并非循环的组成部分。因此python将指出这种错误:

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

3. 创建数值列表

使用函数range()

python函数range()让你能够轻松地生成一系列数。例如,可以像下面这样使用函数range()来打印一系列数:

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

上述代码好像应该可以打印数1~5,但实际上不会打印5:

1
2
3
4
5

要打印数1~5,需要使用range(1,6):

>>> for value in range(1, 6):
>>> 	print(value)

使用range()创建数字列表

要创建数字列表,可使用函数list()range()的结果直接转换为列表。如果将range()作为list()的参数,输出将是一个数字列表:

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

结果如下:

[1, 2, 3, 4, 5]

使用函数range()时,还可指定步长。为此,可给这个函数指定第三个参数,python将根据这个步长来生成数。
例如,下面的代码打印1~10的偶数:

>>> even_numbers = list(range(2, 11, 2)
>>> 	print(even_numbers)

输出结果为:

[2, 4, 6, 8, 10]

创建包含前10个整数(1~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]

为了让代码简洁,可不使用临时变量square,而直接将每个计算得到的值附加到列表末尾:

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

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

有几个专门用于处理数字列表的pyton函数。例如,你可以轻松地找出数字列表的最大值最小值总和

>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45

列表解析

前面介绍的生成列表 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循环为for value in range(1, 11),它将值1~10提供给表达式 value ** 2 。请注意,这里的for语句末尾没有冒号


使用列表的一部分

处理列表的部分元素,python称之为切片。

切片

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

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

上述代码打印列表的一个切片,其中只包含三名队员。输出也是一个列表,其中包含前三名队员:

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

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

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

如果要提取从第三个元素到列表末尾的所有元素,可将起始索引指定为2,并省略终止索引:

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

如果要输出名单上的最后三名队员,可使用切片players[-3:]

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

注意,可在表示切片的方括号内指定第三个值(和range(1, 11, 2)中第三个值作用一样)。这个值告诉python在指定范围内每隔多少元素提取一个。

遍历切片

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

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

复制列表

要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。这让python创建一个始于第一个元素、终止于最后一个元素的切片,即整个列表的副本。
例如,你喜欢的食品,你朋友也都喜欢,因此可以通过复制来创建这个列表:

>>> my_foods = ['pizza', 'falafel', 'carrot cake']
>>> friend_foods = my_foods[:]
>>> '''不要使用friend_foods = my_foods,这会导致friend_foods和my_foods
共用同一个列表,其中一个改变,另一个也会跟着改变,所以复制列表要用切片'''

>>> 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 = ['pizza', 'falafel', 'carrot cake']
friends_foods = my_foods[:]

my_foods.append("cannoli")
friends_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 = ['pizza', 'falafel', 'carrot cake']

# friend_foods = my_foods 行不通

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', 'ice cream']

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

元组元素不可变的列表(但是整体可以重新定义)

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可改变的元素,元组可以满足这种需求。python将不能修改的值称为不可变的,而不可变的列表被称为元组

定义元组

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

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

其中定义元组用了圆括号而不是中括号。
尝试修改元组 dimensions 中的一个元素,看看结果如何:

dimensions = (200, 50)
dimensions[0] = 250

上述代码试图修改元组中的第一个元素,导致python返回类型错误消息:

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

严格地说,元素是由逗号标识的,圆括号只是让元组看起来更整洁’更清晰。如果你要定义只包括一个元素的元组,必须在这个元素后面加上逗号:
my_t = (3,) 创建只包含一个元素的元组通常没有意义,但自动生成的元组有可能只有一个元素。

遍历元组中的所有值

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

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

结果:

200
50

修改元组变量

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

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

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

这次python不会引发任何错误,因为给元组变量重新赋值是合法的:

Original dimensions:
200
50

Modified dimensions:
400
100

相比于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内部都不变,就可以使用元组。