列表由一系列按特定顺序排列的元素组成,列表中可以加入字母、数字、字符串等,其各元素之间可以没有任何关系。python中,用([ ])表示列表,并用逗号分隔其中的要素。
language=['python','java','golong','C']
print(language)
#输出结果
['python', 'java', 'golong', 'C']
用python直接打印列表时,python会把列表的内部表示直接打印出来,包括方括号和逗号。
1 列表相关函数
1.1 访问和使用列表元素
访问列表元素,只需将该元素的位置或者索引告诉python即可。要访问列表元素,只需要指出列表名称,再指出元素索引,并将其放在方括号内即可。
language=['python','java','golong','C']
print(language[0])
#输出结果
python
python为访问最后一个列表元素提供了特殊的方法,通过将索引指定为-1,可让python返回最后一个列表元素。该约定也适用于其他负数索引,如索引-2返回倒数第二个列表元素。
language=['python','java','golong','C']
print(language[-1])
print(language[-2])
#输出结果
C
golong
可对任何列表元素使用字符串方法,如:
language=['python','java','golong','C']
print(language[1].title())
#输出结果
Java
1.2 修改、添加和删除列表元素
1.2.1 修改列表元素
要修改列表元素,可指定列表名和要修改的元素的索引,再指定该元素的新值。例如:
language=['python','java','golong','C']
print(language[1])
language[1]='javascript'
print(language[1])
#输出结果
java
javascript
1.2.2 在列表中添加元素
1.2.2.1 在列表末尾添加元素
在列表末尾添加元素时,可使用方法append( )将待添加元素添加至列表末尾,而不影响其他元素。在创建列表时,可以先创建一个空表,然后利用append( )方法将元素填入。
language=['python','java','golong','C']
print(language)
language.append('C++')
print(language)
#输出结果
['python', 'java', 'golong', 'C']
['python', 'java', 'golong', 'C', 'C++']
1.2.2.2 在列表中插入元素
使用方法 insert( )可以在列表的任何位置添加元素,此时,需要指定新元素的索引和值。
language=['python','java','golong','C']
print(language)
language.insert(1,'C++')
print(language)
#输出结果
['python', 'java', 'golong', 'C']
['python', 'C++', 'java', 'golong', 'C']
1.2.3 删除元素
1.2.3.1 使用del语句删除元素
当知道待删除元素在列表中的位置时,可使用del语句。使用del语句将值从列表中删除后,就无法再访问该值了。
language=['python','java','golong','C']
print(language)
del language[1]
print(language)
del language[-1]
print(language)
#输出结果
['python', 'java', 'golong', 'C']
['python', 'golong', 'C']
['python', 'golong']
1.2.3.2 使用pop( )删除元素
方法pop( )可删除列表末尾的元素,并让你可以继续使用该元素。其机理类似在栈中弹出栈顶元素。使用pop( )也可以删除任意位置的元素,只要在括号内填入待删除元素的索引即可。
删除列表末尾元素
language=['python','java','golong','C']
print(language)
rear=language.pop()
print(language)
print(rear)
#输出结果
['python', 'java', 'golong', 'C']
['python', 'java', 'golong']
C
删除列表任意位置的元素
language=['python','java','golong','C']
print(language)
rear=language.pop(2)
print(language)
print(rear)
#输出结果
['python', 'java', 'golong', 'C']
['python', 'java', 'C']
golong
1.2.3.3 根据值删除元素
当不知道待删除元素的索引,而只知道它的值的时候,可以使用remove( )从列表中删除该元素。
language=['python','java','golong','C']
print(language)
language.remove('golong')
print(language)
#输出结果
['python', 'java', 'golong', 'C']
['python', 'java', 'C']
使用remove( )删除列表中的元素时,可以接着使用它的值。例如:
language=['python','java','golong','C']
print(language)
best_one='python'
language.remove(best_one)
print(language)
print(best_one)
#输出结果
['python', 'java', 'golong', 'C']
['java', 'golong', 'C']
python
方法remove( )只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
1.3 组织列表
在创建的列表中,元素的排列常常是无法预测的。实际应用中,有时需要保留列表元素最初的排列顺序,有时又需要调整排列顺序。因此,python提供了许多组织列表的方式,可根据具体情况选用。
1.3.1 使用方法sort( )对列表进行永久性排序
sort( )函数默认对列表中要素按照ASCII码进行升序排序,且方法sort( )永久性地改变了列表元素的排列顺序,无法再恢复到原来的排列顺序。例如:
language=['python','java','golong','C','@123','123','c','?']
language.sort()
print(language)
#输出结果
['123', '?', '@123', 'C', 'c', 'golong', 'java', 'python']
ASCII码对照表(引自免费文档中心)
方法sort( )还可以按照ASCII码进行降序排列,只需向sort( )方法传递参数reverse=True 即可。
language=['python','java','golong','C','@123','123','c','?']
language.sort(reverse=True)
print(language)
#输出结果
['python', 'java', 'golong', 'c', 'C', '@123', '?', '123']
1.3.2 使用sorted( )对列表进行临时排序
函数sorted( )可以让你能够按ASCII码升序的顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。当向sorted( )函数传递参数reverse=True时,可以实现按ASCII码降序的顺序显示列表元素。
language=['python','java','golong','C','@123','123','c','?']
print(language) #原始排列顺序
print(sorted(language)) #使用sorted()进行升序排列
print(language) #验证sorted()并没有改变原始排列顺序
print(sorted(language,reverse=True)) #使用sorted()进行降序排列
print(language) #验证sorted()并没有改变原始排列顺序
#输出结果
['python', 'java', 'golong', 'C', '@123', '123', 'c', '?']
['123', '?', '@123', 'C', 'c', 'golong', 'java', 'python']
['python', 'java', 'golong', 'C', '@123', '123', 'c', '?']
['python', 'java', 'golong', 'c', 'C', '@123', '?', '123']
['python', 'java', 'golong', 'C', '@123', '123', 'c', '?']
1.3.3 倒着打印列表
使用方法reverse( )可以反转列表元素的排列顺序。reverse()永久改变列表元素的排列顺序,但只需再次reverse()即可恢复。
language=['python','java','golong','C']
language.reverse()
print(language)
language.reverse()
print(language)
#输出结果
['C', 'golong', 'java', 'python']
['python', 'java', 'golong', 'C']
1.3.4 确定列表的长度
使用len( )函数可快速获取列表的长度。且len()函数返回的是一个int 型的值
language=['python','java','golong','C']
n=len(language)
print(type(n))
print(n)
#输出结果
<class 'int'>
4
1.4 操作列表
1.4.1 遍历整个列表
在python中,如果需要对列表中的每个元素都执行相同的操作,可以使用for循环实现。
names=['elva','lily','daisy','alice']
for name in names: #python中,用缩进判断是否属于同一代码块
print(name)
print('over')
#输出结果
elva
lily
daisy
alice
over
1.4.2 创建数值列表
列表非常适合用于存储数字集合,python提供了很多工具,可以帮助高效处理数字列表。
1.4.2.1 range( )函数
在python中,使用range( )函数可以轻松生成一系列数字。
for value in range(1,5):
print(value)
#输出结果
1
2
3
4
在该示例中,range( )只是打印数字1~4,函数range( )让python从你指定的第一个值开始教,并在到达你指定的第二个值后终止,因此输出不包含第二个值(示例中为5)。
当要创建数字列表时,可以使用函数list( )将range( )的结果直接转换成列表,如果将range( )作为list( )的参数,输出将为一个数字列表。
numbers=list(range(1,5))
print(numbers)
#输出结果
[1, 2, 3, 4]
使用range( )时,还可以指定步长。例如下面的代码打印1~10内的偶数。
numbers=list(range(2,11,2))
print(numbers)
#输出结果
[2, 4, 6, 8, 10]
使用range( )函数几乎能创建任意需要的数字集。以下代码展示了如何创建一个列表,其中包含前10个整数的平方。(python中用(**)表示乘方)
squares=[]
for value in range(1,11):
square=value**2
squares.append(square)
print(squares)
#为了使代码更简洁,可以不使用临时变量square,直接将每个计算的值附加到列表末尾
squares=[]
for value in range(1,11):
squares.append(value**2)
print(squares)
#输出结果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#两段代码输出结果一致
1.4.2.2 对数字列表执行简单的统计计算
python中有一些专门处理数字列表的python函数。
digits=[1,2,3,4,5,6,7,8,9,10]
print(min(digits))
print(max(digits))
print(sum(digits))
#输出结果
1
10
55
1.4.2.3 列表解析
列表解析可以将for循环和创建新元素的代码合并成一行,并自动附加新元素。
例:下列代码将创建1~10的平方数列表
squares=[value**2 for value in range(1,11)] #注意!此处的for语句没有冒号!!!
print(squares)
#输出结果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
1.4.3 使用列表的一部分
利用python中的切片,可以处理列表的部分元素。
1.4.3.1 创建切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range( )一样,python在到达你指定的第二个索引前面的元素后停止,要输出列表中的前三个元素,需要指定索引0~3,这将输出分别为0,1,2的元素。
names=['elva','lily','saily','daisy','jenny']
print(names[0:3])
#输出结果
['elva', 'lily', 'saily']
也可以根据需求生成列表的任何子集,例如当需要提取列表的第2~4个元素,可将起始索引指定为1,并将终止索引指定为4。
names=['elva','lily','saily','daisy','jenny']
print(names[1:4])
#输出结果
['lily', 'saily', 'daisy']
如果没有指定起始索引,python将自动从列表开头开始。
类似地,如果省略终止索引,切片将终止于列表末尾。
names=['elva','lily','saily','daisy','jenny']
print(names[:4]) #省略起始索引
print(names[2:])
#输出结果
['elva', 'lily', 'saily', 'daisy']
['saily', 'daisy', 'jenny']
利用负数索引可以输出列表末尾的切片,例如要输出名单上最后三个人名,可以使用切片names[-3:]:
names=['elva','lily','saily','daisy','jenny']
print(names[-3:])
#输出结果
['saily', 'daisy', 'jenny']
1.4.3.2 遍历切片
可以在for循环中使用切片以遍历列表中的部分元素。例如,以下代码遍历列表中的前三个元素。
names=['elva','lily','saily','daisy','jenny']
for name in names[:3]:
print(name.title())
#输出结果
Elva
Lily
Saily
1.4.3.3 复制列表
要复制列表,可以创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引。如以下代码所示,便复制创建了一个新的列表。
names=['elva','lily','saily','daisy']
new_names=names[:]
print(names)
print(new_names)
#输出结果
['elva', 'lily', 'saily', 'daisy']
['elva', 'lily', 'saily', 'daisy']
为验证新创建的列表与原列表并非同一列表,即二者的数据在内存中分开存储,我们向两个列表分别添加一个不同的元素,如以下代码所示:
names=['elva','lily','saily','daisy']
new_names=names[:]
names.append('jenny')
new_names.append('marry')
print(names)
print(new_names)
#输出结果
['elva', 'lily', 'saily', 'daisy', 'jenny']
['elva', 'lily', 'saily', 'daisy', 'marry']
#两个姓名都已添加到正确的列表中,即两个列表各自的操作不会影响另一个列表
但如果只是简单地将names赋值给new_names,则无法得到两个列表。如以下代码所示:
names=['elva','lily','saily','daisy']
new_names=names
names.append('jenny')
print(names)
print(new_names)
new_names.append('marry')
print(names)
print(new_names)
#输出结果
['elva', 'lily', 'saily', 'daisy', 'jenny']
['elva', 'lily', 'saily', 'daisy', 'jenny']
['elva', 'lily', 'saily', 'daisy', 'jenny', 'marry']
['elva', 'lily', 'saily', 'daisy', 'jenny', 'marry']
#可以理解为:赋值之后,new_names只是一个指向原names存储空间的指针,
#此时无论是对names还是new_names进行操作,都是在对统一存储空间的数据进行操作
1.5 元组
列表是可以修改的,因此适合存储在程序运行期间会发生变化的数据集。然而,当你需要创建一系列不可修改的元素时,就需要用到元组。即元组是不可修改的列表。
1.5.1 元组的定义
元组使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。元组中的元素一旦确定,就不能修改,任何试图修改元组中元素的操作都是被禁止的。
dimensions=(200,50)
print(dimensions[0])
print(dimensions[1])
#输出结果
200
50
#当试图修改元组中元素时
dimensions=(200,50)
dimensions[0]=250
#编译器就会报错
Traceback (most recent call last):
File "D:\pythonProject\first\my_first_python.py", line 4, in <module>
dimensions[0]=250
~~~~~~~~~~^^^
TypeError: 'tuple' object does not support item assignment
1.5.2 遍历元组中的所有值
像列表一样,可以利用for循环遍历元组中的所有值。
dimensions=(200,50)
for dimension in dimensions:
print(dimension)
#输出结果
200
50
1.5.3 修改元组变量
虽然不能修改元组的元素,但可以给存储元组的变量赋值,即可重新定义元组。
dimensions=(200,50)
print('Original dimensions :')
for dimension in dimensions:
print(dimension)
dimensions=(400,100)
print('New dimensions :')
for dimension in dimensions:
print(dimension)
#输出结果
Original dimensions :
200
50
New dimensions :
400
100
说明
参考图书:Python编程: 从入门到实践 /(美)埃里克·马瑟斯 (Eric Matthhes) 著; 袁国忠译. --北京: 人民邮电出版社, 2016. 7