目录
一.列表是什么
二.访问创建列表
1.访问列表
1)访问列表元素
2)遍历列表
2.创建列表
函数range()创建数值列表
三.操作列表(增、删、查、改、用)
增
在列表中添加元素
删
在列表中删除元素
改
1.修改列表元素
2.对列表进行永久性排序
3.对列表进行临时排序
4.确定列表的长度
用
1.切片
2.复制列表
四.元组(不可变的列表
列表由一系列按特定顺序排列的元素组成。python中,用方括号[ ]来表示列表,用逗号分隔其中的元素。
>>> bicycles=["trek","cannondale","redline"]
>>> bicycles
['trek', 'cannondale', 'redline']
列表是有序集合,访问列表的任何元素只需将该元素的位置或索引告诉python即可。要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。
#接上述代码
>>> print(bicycles[0])
trek
>>> bicycles[0]
'trek'
>>> print(bicycles[0].title())
Trek
#访问从0开始而不是从1开始
>>> print(bicycles[1])
cannondale
>>> print(bicycles[2])
redline
>>> print(bicycles[-1])
redline
#使用列表中的值
>>> message="my first bicycle was a "+bicycles[1].title()+"."
>>> print(message)
my first bicycle was a Cannondale.
python中,第一个列表元素的索引为0而不是1,大多数编程语言中都是如此,与列表操作的底层实现相关;访问最后一个列表元素可通过将索引指定为-1实现。
实际中常需要遍历列表的所有元素,对每个元素执行相同的操作,例如在网站中,可能需要显示文章列表中的每个标题等。
#for循环遍历列表
>>> bicycles=['trek', 'redline', 'cannondale']
>>> for bicycle in bicycles:
... print(bicycle.title()+" is great!")
...
Trek is great!
Redline is great!
Cannondale is great!
>>> print("thank you")#注意此处print语句无缩进
thank you
>>> print(bicycle)
cannondale
>>> print(bicycles)
['trek', 'redline', 'cannondale']
for bicycle in bicycles:定义了一个for循环,这行代码让python从列表bicycles中取出一个名字,并将其存储在变量bicycle中,for语句末尾的冒号告诉python,下一行是循环的第一行。print(bicycle)让python打印前面存储到变量bicycle中的名字。这样,对于列表中的每个名字,python都将重复执行上述两列代码行,输出就是列表中的所有名字。
注意:
冒号别遗漏;
for循环语句下面print语句缩进问题:
#for循环下面一行中,首条print语句没有缩进,报错
>>> bicycles=['trek', 'redline', 'cannondale']
>>> for bicycle in bicycles:
... print(bicycle)
File "", line 2
print(bicycle)
^
IndentationError: expected an indented block
#执行完一条print语句,再执行print语句时缩进,报错
>>> bicycles=['trek', 'redline', 'cannondale']
>>> for bicycle in bicycles:
... print(bicycle)
...
trek
redline
cannondale
>>> print(bicycle.title()+" is great!")
File "", line 1
print(bicycle.title()+" is great!")
IndentationError: unexpected indent
#连续输入缩进print语句,不执行(每条语句输完后按一次enter键),输完了再一起执行(两次enter),无报错
>>> bicycles=['trek', 'redline', 'cannondale']
>>> for bicycle in bicycles:
... print(bicycle)
... print(bicycle.title()+" is great!")
...
trek
Trek is great!
redline
Redline is great!
cannondale
Cannondale is great!
#for循环语句下面,两条缩进的print语句,最后一条无缩进print语句,报错
>>> bicycles=['trek', 'redline', 'cannondale']
>>> for bicycle in bicycles:
... print(bicycle)
... print(bicycle.title()+" is great!")
... print("thank you")
File "", line 4
print("thank you")
^
SyntaxError: invalid syntax
#for循环语句执行完后,缩进print语句,报错
>>> print(bicycles)
File "", line 1
print(bicycles)
IndentationError: unexpected indent
总结为:for语句中的print语句需要缩进,缩进的print语句将被执行多次;执行完for语句后,print语句不能缩进,只执行一次。
在数据可视化中,处理的几乎都是由数字(如温度、距离、人口数量、经纬度等)组成的集合,列表非常适合用于存储数字集合。
(1)直接bicycles=['trek', 'redline', 'cannondale'];
(2)bicycles=list(range(1,6))创建简单数字列表;
(3)先创建空列表squares=[ ],再利用for循环对range()函数中的数字进行相应赋值实现复杂数字列表的创建。
#使用函数range()打印一系列的数字
>>> for value in range(1,5):
... print(value)
...
1
2
3
4
#创建数字列表
numbers=list(range(1,6))
>>> print(numbers)
[1, 2, 3, 4, 5]
#打印1~10内的偶数
>>> even_numbers=list(range(2,11,2))
>>> print(even_numbers)
[2, 4, 6, 8, 10]
#创建一个列表,其中包含前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]
#创建一个列表,其中包含前10个整数的平方(不用临时变量)
>>> squares=[]
>>> for value in range(1,11):
... squares.append(value**2)
...
>>> print(squares)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#对数字列表执行简单的统计计算
>>> min(squares)#找出数字列表最小值
1
>>> max(squares)#找出数字列表最大值
100
>>> sum(squares)#求数字列表总和
385
函数range()能够生成一系列的数字,让python从指定的第一个值开始数,并在到达指定的第二个值后停止,因此输出不包含第二个值(此处为5);要创建数字列表,可将range()作为其参数,使用函数list()将range()的结果直接转换为列表;函数range()可以指定步长,上述代码为打印1~10内的偶数,函数range()从2开始数,不断加2,直到达到或超过终值(11)。
创建一个列表,其中包含前10个整数的平方(用临时变量):先创建一个空列表;再使用函数range()让python遍历1~10的值;在循环中,计算当前值的平方,并将结果存储到临时变量square中;再将新计算得到的平方值附加到列表squares末尾;最后循环结束后打印列表squares。为使代码更简洁,可不使用临时变量square,直接将每个计算得到的值附加到列表末尾。
#在列表末尾添加元素
>>> bicycles.append("2")
>>> print(bicycles)
['1', 'cannondale', 'redline', '2']
#在列表中插入元素
>>> bicycles.insert(0,"3")
>>> print(bicycles)
['3', '1', 'cannondale', 'redline', '2']
方法append()将元素添加到列表末尾,而不影响列表中的其它元素,它让动态创建列表易如反掌。因为现实中经常要等程序运行后,才能知道用户要在程序中存储哪些数据。为控制用户,可以先创建一个空列表,用于存储用户将要输入的值,然后将用户提供的每个新值附加到列表中;方法insert()可在列表的任何位置添加新元素,需要指定新元素的索引和值。在索引0处添加空间,并将值存储到这个地方,这种操作将列表中既有的每个元素都右移一个位置。
#1.使用del语句
>>> del bicycles[0]
>>> print(bicycles)
['1', 'cannondale', 'redline', '2']
#2.使用pop()方法
>>> poped_bicycles=bicycles.pop()
>>> print(poped_bicycles)
2
>>> print(bicycles)
['1', 'cannondale', 'redline']
#(注意事项)
#列表改变,再次使用pop方法
>>> print("the last bicycles I owned was a "+bicycles.pop().title()+".")
the last bicycles I owned was a Redline.
#使用poped_bicycles变量
>>> print("the last bicycles I owned was a "+poped_bicycles.title()+".")
the last bicycles I owned was a 2.
#3.使用remove()方法
>>> bicycles.remove("1")
>>> print(bicycles)
['cannondale']
>>> expensive="cannondale"
>>> bicycles.remove(expensive)
>>> print(bicycles)
[]
>>> print("the "+expensive+" is too expensive for me.")
the cannondale is too expensive for me.
使用del可删除任何位置处的列表元素,条件是知道其索引;方法pop()可删除列表末尾的元素,并让你能够接着使用它。此例中若要继续使用删除的列表末尾元素,可引用变量poped_bicycles。假设列表中的自行车是按照购买时间存储的,就可以使用方法pop()打印一条消息,指出最后购买的是哪款自行车;只知道要删除的元素的值,而不知道其位置,可使用方法remove(),使用remove()方法从列表中删除元素时,也可以接着使用它的值。但是它只删除第一个指定的值,如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
注意:经过pop()方法删除列表末尾元素,列表已经发生改变,末尾元素已经变成redline,故下面再使用bicycles.pop()时,其代表的元素是redline;而使用poped_bicycles变量时,则不会改变。
>>> bicycles[0]="1"
>>> print(bicycles[0])
1
>>> print(bicycles)
['1', 'cannondale', 'redline']
>>> bicycles=["trek","cannondale","redline"]
#按字母顺序
>>> bicycles.sort()
>>> print(bicycles)
['cannondale', 'redline', 'trek']
#按字母相反顺序
>>> bicycles.sort(reverse=True)
>>> print(bicycles)
['trek', 'redline', 'cannondale']
#反转列表顺序
>>> bicycles.reverse()
>>> print(bicycles)
['cannondale', 'redline', 'trek']
方法sort()永久性地修改了列表元素的排列顺序,使之按字母顺序排列,再也无法恢复到原来的排列顺序;向sort()方法传递参数reverse=True即可按与字母相反的顺序排列列表元素;方法reverse()永久性地修改元素的排列顺序,但可随时恢复到原来的排列顺序,只需对列表再次调用方法reverse()即可。
函数sorted()保留元素原来的排列顺序,同时以特定的顺序呈现元素。
#重新定义bicycles,打乱顺序
>>> bicycles=["trek","cannondale","redline"]
#sorted()是函数,不能使用调用方法的形式去使用,不然就会报错
>>> bicycles.sorted()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'list' object has no attribute 'sorted'
>>> print(bicycles)
['trek', 'cannondale', 'redline']
#正确使用sorted()函数
>>> print(sorted(bicycles))
['cannondale', 'redline', 'trek']
>>> print(bicycles)
['trek', 'cannondale', 'redline']
#临时按与字母相反顺序显示列表
>>> print(sorted(bicycles,reverse=True))
['trek', 'redline', 'cannondale']
#检查列表顺序没有改变
>>> print(bicycles)
['trek', 'cannondale', 'redline']
调用函数sorted()后,列表元素的排列顺序并没有变,如果要临时按与字母相反的顺序显示列表,也可向函数sorted()传递参数reverse=True。注意:调用函数和调用方法是不一样的,注意区分。
>>> print(bicycles)
['cannondale', 'redline', 'trek']
>>> len(bicycles)
3
#提取列表的第1~2个元素
>>> bicycles=["trek","cannondale","redline"]
>>> print(bicycles[0:2])
['trek', 'cannondale']
#省略起始索引
>>> print(bicycles[:2])
['trek', 'cannondale']
#省略终止索引
>>> print(bicycles[0:])
['trek', 'cannondale', 'redline']
#遍历切片
>>> for bicycle in bicycles[:2]:
... print(bicycle.title())
...
Trek
Cannondale
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。python在到达指定的第二个索引前面的元素后停止。要输出列表的前两个元素,利用代码bicycles[0:2]指定索引0~2,将输出分别为0和1对应的元素。若没有指定第一个索引,python将自动从列表开头开始,要让切片终止于列表末尾,则可以省略终止索引。
注意:range(1,5)中,从指定的第一个值开始数,并在到达指定的第二个值后停止,因此输出不包含第二个值。切片bicycles[0:2]中,提取的是列表中的第“起始+1”个值开始,到第“终止”值结束的元素。即若切片是[1:8],则输出的是从第2个元素起,到第8个元素止的元素序列。
(1)切片的方法:同时省略起始索引和终止索引([ : ]),这让python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
#利用切片方法复制列表
>>> bicycles=["trek","cannondale","redline"]
>>> motuos=bicycles[:]
>>> print(motuos)
['trek', 'cannondale', 'redline']
#修改源列表,复制的列表不改变
>>> bicycles.append("1")
>>> print(bicycles)
['trek', 'cannondale', 'redline', '1']
>>> print(motuos)
['trek', 'cannondale', 'redline']
#不使用切片,直接赋值
>>> motuos=bicycles
>>> print(motuos)
['trek', 'cannondale', 'redline', '1']
>>> bicycles.append("2")
>>> print(motuos)
['trek', 'cannondale', 'redline', '1', '2']
使用切片的方法,仅将源列表的副本复制到新列表,源列表改变新列表不会改变;如果采用直接赋值的办法,则源列表改变时新列表也跟着改变。
相比于列表,元组是更简单的数据结构,如果需要存储的一组值在程序的整个生命周期内都不可变,可使用元组。它使用圆括号而不是方括号来标识。虽然不能修改元组的元素,但可以给存储元组的变量赋值.
>>> dimensions=(200,5)
>>> print(dimensions)
(200, 5)
>>> for dimension in dimensions:
... print(dimension)
...
200
5
#给存储元组的变量赋值
dimensions=(400,100)
>>> dimensions=(400,100)
>>> for dimension in dimensions:
... print(dimension)
...
400
100
注:本文主要参考《python编程:从入门到实践》(【美】Eric Matthes著 袁国忠 译)第三、四章内容。