列表
在Python中,用方括号([])表示列表,并用逗号分隔其中的元素。如果让Python将列表打印出来,Python将打印列表的内部表示,包括方括号:[插图]
bicycles = ['trek','cannondale','redline','specialized']
# 输出:['trek','cannondale','redline','specialized']
print(bicycles)
2
3
Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1,可让Python返回最后一个列表元素:
bicycles = ['trek','cannondale','redline','specialized']
print(bicycles[-1])
2
这种约定也适用于其他负数索引。例如,索引-2返回倒数第二个列表元素,索引-3返回倒数第三个列表元素,依此类推。
bicycles = ['trek','cannondale','redline','specialized']
message = f"My first bicycle was a {bicycles[0].title()}."
# 输出内容为:My first bicycle was a Trek.
print(message)
2
3
4
5
要修改列表元素,可指定列表名和要修改的元素的索引,再指定该元素的新值。
motorcycles = ['honda','yamaha','suzuki']
motorcycles[0] = 'ducati'
print(motorcycles)
2
3
4
在列表中添加新元素时,最简单的方式是将元素附加(append)到列表。给列表附加元素时,它将添加到列表末尾。
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles)
motorcycles.append('ducati')
2
3
4
使用方法 insert()
可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。
motorcycles = ['honda','yamaha','suzuki']
motorcycles.insert(0,'ducati')
# ['ducati','honda','yamaha','suzuki']
print(motorcycles)
2
3
4
5
6
如果知道要删除的元素在列表中的位置,可使用del语句。
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles)
del motorcycles[0]
print(motorcycles)
2
3
4
5
方法pop()删除列表末尾的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。
motorcycles = ['honda','yamaha','suzuki']
popped_motorcycle = motorcycles.pop()
# ['honda','yamaha']
print(motorcycles)
# suzuki
print(popped_motorcycle)
2
3
4
5
6
7
8
9
实际上,可以使用pop()来删除列表中任意位置的元素,只需在圆括号中指定要删除元素的索引即可。
motorcycles = ['honda','yamaha','suzuki']
first_owned = motorcycles.pop(0)
# The first motorcycle I owned was a Honda.
print(f"The first motorcycle I owned was a {first_owned.title()}.")
2
3
4
5
6
如果你不确定该使用del语句还是pop()方法,下面是一个简单的判断标准:如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()。
有时候,你不知道要从列表中删除的值所处的位置。如果只知道要删除的元素的值,可使用方法remove()。
motorcycles = ['honda','yamaha','suzuki','ducati']
motorcycles.remove('ducati')
2
3
Python方法sort()让你能够较为轻松地对列表进行排序(按字母顺序升序排列)。方法sort()永久性地修改列表元素的排列顺序。
cars = ['bmw','audi','toyota','subaru']
cars.sort()
# ['audi','bmw','subaru','toyota']
print(cars)
2
3
4
5
还可以按与字母顺序相反的顺序排列列表元素,只需向sort()方法传递参数reverse=True即可。
cars = ['bmw','audi','toyota','subaru']
cars.sort(reverse=True)
# ['toyota','subaru','bmw','audi']
print(cars)
2
3
4
5
要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()。函数sorted()让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。
注意,调用函数sorted()后,原始列表元素的排列顺序并没有变。如果要按与字母顺序相反的顺序显示列表,也可向函数sorted()传递参数reverse=True。
要反转列表元素的排列顺序,可使用方法reverse()。注意,reverse()不是按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序。方法reverse()永久性地修改列表元素的排列顺序,但可随时恢复到原来的排列顺序,只需对列表再次调用reverse()即可。
使用函数len()可快速获悉列表的长度。
cars = ['bmw','audi','toyota','subaru']
# 4
len(cars)
2
3
4
索引错误的话会导致报错,比如下面这段代码:
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles[3])
2
会导致报错:
Traceback (most recent call last):
File "motorcycles.py",line 2,in <module>
print(motorcycles[3])
IndexError:list index out of range
2
3
4
遍历列表,可以使用 for 语句。for语句末尾的冒号告诉Python,下一行是循环的第一行。如果不小心遗漏了冒号,将导致语法错误,因为Python不知道你意欲何为。
magicians = ['alice','david','carolina']
for magician in magicians:
print(magician)
2
3
Python函数range()让你能够轻松地生成一系列数。例如,可以像下面这样使用函数range()来打印一系列数:
for value in range(1,5):
print(value)
2
上述代码会输出1~4,不会输出5:
1
2
3
4
2
3
4
调用函数range()时,也可只指定一个参数,这样它将从0开始。例如,range(6)返回数0~5。
要创建数字列表,可使用函数list()将range()的结果直接转换为列表。如果将range()作为list()的参数,输出将是一个数字列表。
numbers = list(range(1,6))
# [1,2,3,4,5]
print(numbers)
2
3
4
使用函数range()时,还可指定步长。为此,可给这个函数指定第三个参数,Python将根据这个步长来生成数。
even_numbers = list(range(2,11,2))
# [2,4,6,8,10]
print(even_numbers)
2
3
4
使用函数range()几乎能够创建任何需要的数集。例如,如何创建一个列表,其中包含前10个整数(1~10)的平方呢?在Python中,用两个星号(**)表示乘方运算。下面的代码演示了如何将前10个整数的平方加入一个列表中:
squares = []
for value in range(1,11):
squares.append(value ** 2)
# [1,4,9,16,25,36,49,64,81,100]
print(squares)
2
3
4
5
6
有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的最大值、最小值和总和:
digits = [1,2,3,4,5,6,7,8,9,0]
# 0
min(digits)
# 9
max(digits)
# 45
sum(digits)
2
3
4
5
6
7
8
9
10
前面介绍的生成列表squares的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表。列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
# 请注意,这里的for语句末尾没有冒号。
squares = [value**2 for value in range(1,11)]
# [1,4,9,16,25,36,49,64,81,100]
print(squares)
2
3
4
5
除了处理整个列表,你还可以处理列表的部分元素,Python称之为切片。
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python在到达第二个索引之前的元素后停止。
players = ['charles','martina','michael','florence','eli']
# ['charles','martina','michael']
print(players[0:3])
2
3
4
如果没有指定第一个索引,Python将自动从列表开头开始:
players = ['charles','martina','michael','florence','eli']
# ['charles','martina','michael','florence']
print(players[:4])
2
3
4
要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第三个元素到列表末尾的所有元素,可将起始索引指定为2,并省略终止索引:
players = ['charles','martina','michael','florence','eli']
# ['michael','florence','eli']
print(players[2:])
2
3
4
前面说过,负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任意切片。例如,如果要输出名单上的最后三名队员,可使用切片players[-3:]:
players = ['charles','martina','michael','florence','eli']
print(players[-3:])
2
注意
注意:可在表示切片的方括号内指定第三个值。这个值告诉Python在指定范围内每隔多少元素提取一个。
遍历切片:
players = ['charles','martina','michael','florence','eli']
print("Here are the first three players on my team:")
for player in players[:3]:
print(player.title())
2
3
4
5
打印内容如下:
Here are the first three players on my team:
Charles
Martina
Michael
2
3
4
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。
元组
Python将不能修改的值称为不可变的,而不可变的列表被称为元组。元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可使用索引来访问其元素,就像访问列表元素一样。
注意:严格地说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更清晰。如果你要定义只包含一个元素的元组,必须在这个元素后面加上逗号:
my_t = (3,)
遍历元组中的所有值:
dimensions = (200,50)
for dimension in dimensions:
print(dimension)
2
3
相比于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内都不变,就可以使用元组。