1. 列表初阶
1) 列表
列表是一种有序的集合,可以随时为其添加和删除元素。
列表中的元素可以是任意类型的,如字符串、整数、浮点数等。
eg: 创建学生花名册时,若有多少个学生就定义多少个变量会十分麻烦,因此可以创建列表将名册存入其中:
students = [
'晗晗',
'琴琴',
'璇璇'
]
上面由一对中括号包裹,每个姓名用逗号隔开的就是列表。
2) 列表和列表元素
定义列表时,要用中括号把所有数据框起来,其中每个数据叫元素,每个元素之间要用英文逗号隔开。
[]: 只有一对中括号,里面没有元素的就是空列表。元素的获取:
索引——每个元素的位置编号(从0开始)
如上例中['晗晗', '琴琴', '璇璇']三个元素索引分别为0,1,2。可通过索引来读取所需的元素,如print(students[1]),则输出:琴琴。
3) 列表元素的删除
del 列表名[元素的索引]
# del是delete的简写
eg: del students[1]
此时列表中仅剩2个元素,若继续使用students[2]来读取第3个元素,列表索引则会超出范围,程序会报错——IndexError: list index out of range.
4) 列表元素的添加
append()方法可实现元素添加,如:students.append('梦梦')。
append()方法会在列表末尾新增一个元素,同时列表长度加1,若要打印出梦梦的名字,可以通过:print(students[2])。
Exercise: 当晗晗在的时候,自动添加梦梦,然后输出花名册
students = [
'晗晗',
'琴琴',
'璇璇'
]
if '晗晗' in students:
students.append('梦梦')
print(students)
2. 列表进阶
1) 列表元素的插入
insert()方法可以实现在列表中任意位置插入元素。
append()和insert()的区别:
students = ['晗晗', '琴琴']
students.append('璇璇')
print(students)
# 输出:['晗晗', '琴琴', '璇璇']
students.insert(1, '文文')
print(students)
# 输出:['晗晗', '文文', '琴琴', '璇璇']append()方法只接收一个参数,即要添加的元素,直接将该元素添加到列表末尾。
insert()方法接收两个参数,第一个参数为插入位置,第二个参数为插入的元素,它会将元素插入到对应的位置。
列表中元素的修改:
通过索引找到需更改的元素,然后用赋值的方法改变其值。如上例中,将'文文'改为'梦梦':
students[1] = '梦梦'
2) 反向索引正向索引方式:从0开始,到列表长度减1的索引值结束,从左到右递增。
反向索引方式:从-1开始,索引值从右到左递减。
如打印长度为4的列表students中第二个元素的值:
print(students[1])
# 正向索引
print(students[-3])
# 反向索引
Note: 获取列表末尾的元素用反向索引更简单,比如正向索引获取最后一个元素是students[len(students) – 1],反向索引则用students[-1]即可完成。
Eg: 计算12名学生成绩的极差(分数由高到低排列)
scores = [99, 92, 87, 85, 81, 80, 79, 76, 75, 73, 71, 67]
def calc_range(scores):
return scores[0] – scores[-1]
result = calc_range(scores)
print(result)
3) 列表常用方法
以列表students为例:添加:students.append('名字')
插入:students.insert(0, '名字')
索引:students.index('名字')
移除元素:students.pop(1)
移除元素:students.remove('名字')
统计元素出现的次数:students.count('名字')
排序:students.sort()
反转:students.reverse()
复制:students.copy()
清空:students.clear()
①索引
students = ['晗晗', '琴琴', '璇璇']
print(students.index('晗晗')) # 输出:0
print(students.index('文文')) # 报错:ValueError
②移除元素
除del语句外,还可使用pop()和remove()方法删除列表元素。如上例中students列表,可采取三种方式移除‘晗晗’:
del students[0]
students.pop(0)
students.remove('晗晗')
note: remove()方法只删除从左到右第一个内容一样的元素,若删除多个则需多次调用。
如果索引超出范围或元素不在列表中,上述方法都会报错。
③统计元素出现的次数
students = ['晗晗', '琴琴', '晗晗', '璇璇']
print(students.count('晗晗'))
# 输出:2
④排序
sort()可使用默认排序方法对数组进行排序。字符串列表按元素首字母排序:
str_list = ['liu', 'jia', 'yang']
str_list.sort()
print(str_list)
# 输出:['jia', 'liu', 'yang']数值列表按数值从小到大顺序排序。
num_list = [4, 2, 1, 9]
num_list.sort()
print(num_list)
# 输出:[1, 2, 4, 9]
⑤反转,复制,清空
students = ['晗晗', '琴琴', '璇璇']
students.reverse()
print(students)
# 输出:['璇璇', '琴琴', '晗晗']
students1 = ['晗晗', '琴琴', '璇璇']
students2 = students1.copy()
print(students2)
# 输出:['晗晗', '琴琴', '璇璇']
students = ['晗晗', '琴琴', '璇璇']
students.clear()
print(students)
# 输出:[]
Note: copy()方法可解决修改students1中元素影响students2的问题,若直接使用students2 = students1则会造成两个列表修改元素时互相干扰。
Eg: 计算学生成绩的极差(乱序排列)
scores = [89, 92, 77, 85, 81, 90, 89, 86, 79, 93, 91, 96]
def calc_range(scores):
scores.sort()
return scores[-1] – scores[0]
result = calc_range(scores)
print(result)
4) 元组
被圆括号包裹,内部的元素不可更改。
元组具有列表的大多数特性,但如果修改了元组中的元素,运行时将会报错TypeError。
常见的元组运算(以元组students为例):元素是否存在于元组:'元素' in students
索引:students.index('元素')
统计元素出现的次数:students.count('元素')
weekdays = ('周一', '周二', '周三', '周四', '周五')
print(weekdays) # 输出:('周一', '周二', '周三', '周四', '周五')
print(len(weekdays)) # 输出:5
print('周五' in weekdays) # 输出:True
print(weekdays[-3]) # 输出:周三
print(weekdays[1]) # 输出:周二
print(weekdays.index('周二')) # 输出:1
print(weekdays.count('周一')) # 输出:1
3. 批量处理
1) 列表基本运算
①列表的加法
weekdays = ['周一', '周二', '周三'] + ['周四', '周五']
print(weekdays)
# 输出:['周一', '周二', '周三', '周四', '周五']
Note: 列表和元组的加法只能在同种类型之间相加,否则运行时会报错TypeError。如果一定要将其相加,要先使用list()函数将元组转换为列表。
weekdays = ['周一', '周二', '周三'] + list(('周四', '周五'))
print(weekdays)
# 输出:['周一', '周二', '周三', '周四', '周五']
列表和元组相加后,后一个列表和元组中的元素会被逐个添加到前一个列表或元组中,相当于调用了多次append()。但append()一次只能添加一个元素到列表末尾,不能将多个元素同时传入其中。
②列表的乘法
作用:将列表或元组里的元素重复n遍,即将n个同样的列表或元组相加。
food = ['火锅', '烧烤'] * 3
print(food)
# 输出:['火锅', '烧烤', '火锅', '烧烤', '火锅', '烧烤']
Note: 列表的加法和乘法对元组也同样适用。
2) 分片
获取某个位置范围内的元素,用一对以冒号分隔的索引位置来进行操作。对列表进行分片后,会返回一个新的列表。这个新的列表包含这对索引位置所对应的连续的内容。
weekdays = ['周一', '周二', '周三', '周四', '周五']
print(weekdays[1:4])
# 输出:['周二', '周三', '周四']
以weekdays[1:4]为例,冒号左边是分片的起始位置,右边是分片的结束位置,遵循左闭右开原则,即包含起始位置不包含结束位置。
Note: 若省略结束位置,Python将其默认为列表的长度;若省略起始位置,Python将其默认为0,所以weekdays[:]相当于复制了一份weekdays列表。
分片中用正向索引和反向索引效果相同,如weekdays列表中,print(weekdays[2:])和print(weekdays[-3:])会输出相同的结果。
3) range()函数
range(start, stop, step)
# start: 计数从start开始,不填时默认为0
# stop: 计数到stop结束,但不包括stop
# step: 计数的间隔,不填时默认为1
range()函数最多支持3个参数,其中start和step可选。
my_range = range(0, 10, 2)
my_list = list(my_range)
print(my_list)
# 输出:[0, 2, 4, 6, 8]
my_list.append(10)
print(my_list)
# 输出:[0, 2, 4, 6, 8, 10]
Note: 在Python3中,range()函数返回的结果不是列表类型,而是range类型,要调用list()将其类型转换为列表才能使用列表的全部特性。
此外,range()函数的步长也可为负数,生成递减的列表:
my_range = range(0, -10, -2)
my_list = list(my_range)
print(my_list)
# 输出:[0, -2, -4, -6, -8]
Note: range()函数常出现在循环里,配合for循环一起使用。
Eg: 在屏幕上输出100个数字,其中前50个是1-100之间的偶数,后50个是1-100之间的奇数,包含1和100:
even_list = list(range(2, 101, 2))
odd_list = list(range(1, 100, 2))
print(even_list + odd_list)
4) zip()函数
作用:将多个列表中的元素一一组对,通过list()函数转换后,可以得到一个新的列表,列表中的每个元素都是由原先的几个列表中对应元素组成的元组。
Eg: 将四大名著的作者及其信息一一配对,放到新的序列当中:
names = ['吴承恩', '罗贯中', '施耐庵', '曹雪芹']
books = ['西游记', '三国演义', '水浒传', '红楼梦']
times = ['1501年-1582年', '1330年-1400年', '1296年-1370年', '1715年-1763年']
books_info = zip(names, books, times)
print(list(books_info))
# 输出:[('吴承恩', '西游记', '1501年-1582年'), ('罗贯中', '三国演义', '1330年-1400年'), ('施耐庵', '水浒传', '1296年-1370年'), ('曹雪芹', '红楼梦', '1715年-1763年')]
Note: zip()函数和range()函数一样,在Python3中返回的也不是列表类型,而是zip类型,要使用list()函数进行类型转换。
4. 常见错误调用sort()方法对列表排序时不必重新赋值,直接调用即可;
列表正向索引从0开始,最后一个元素索引是列表长度减1;
元组中的元素不可变,对元组进行修改会报错TypeError;
列表的索引必须是整数类型,除法运算得到的结果是浮点数,要调用int()函数进行类型转换,如:print(letters[int(len(letters)/2-3):int(len(letters)/2+4)])可打印letters列表中间位置的7个元素组成的新列表。
Reference:
[1] Wes McKinney. 2017. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython, 2nd Edition [M]. O'Reilly Media, Inc.
[2] CSDN博客. Python博客[OL]. https://www.csdn.net/nav/python. 2020.