实用Python程序设计MOOC-第六章列表
[TOC]
实用Python程序设计MOOC-第六章列表
列表的操作
列表的增删和修改
- 列表可以增删元素,列表的元素可以修改,列表元素可以是任何类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| empty = [] list1 = ['Pku', 'Huawei', 1997, 2000]; list1[1] = 100 print(list1) del list1[2] print(list1) list1 += [100, 110] print(list1) list1.append(200) print(list1) list1.append(['ok', 123]) print(list1)
a = ['a', 'b', 'c'] n = [1, 2, 3] x = [a, n] a[0] = 1 print(x) print(x[0]) print(x[0][1])
|
列表相加
1 2 3 4 5 6
| a = [1, 2, 3, 4] b = [5, 6] c = a + b print(c) a[0] = 100 print(c)
|
列表和+=
- 对列表来说,
a += b
和a = a + b
不同
1 2 3 4 5 6 7
| b = a = [1, 2] a += [3] print(a, b)
a = a + [4, 5] print(a) print(b)
|
列表乘法
1 2 3 4 5 6 7 8 9 10 11 12 13
| print([True] * 3) a = [1, 2] b = a * 3 print(b)
print([a * 3])
c = [a] *3 print(c)
a.append(3) print(c) print(b)
|
重点题目
1 2 3
| a = [[0]] * 2 + [[0]] * 2 a[0][0] = 5 print(a)
|
列表的切片
1 2 3 4 5 6 7 8
| a = [1, 2, 3, 4] b = a[1:3] print(b) b[0] = 100 print(b) print(a) print(a[::-1]) print([1, 2, 3, 4, 5, 6] [1:5:2])
|
列表的遍历
1 2 3 4 5 6 7 8 9
| lst = [1, 2, 3, 4] for x in lst: print(x, end = " ") x = 100 print(lst)
for i in range(len(lst)): lst[i] = 100 print(lst)
|
列表比大小
- 两个列表比大小,就是逐个元素比大小,直到分出胜负。
- 如果有两个对应元素不可比大小,则出runtime error。
1 2 3 4
| print([1, 'a', 12] < [1, 'b', 7]) print([1, 'a'] < [1, 'a', 13]) print([2, 'a'] > [1, 'b', 13]) print([2, 'a'] < ['ab' , 'b', 13])
|
列表应用例题:校门外的树
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…. L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
1 2 3 4 5 6 7 8 9 10 11
| s = input().split() L, M = int(s[0]), int(s[1]) good = [True] * (L + 1)
for i in range(M): s = input().split() start, end = int(s[0]), int(s[1]) for k in range(start, end + 1): good[k] = False
print(sum(good))
|
列表的朴素排序
如果有N个元素需要排序,那么首先从N个元素中找到最小的那个(称为第0小的)放在第0个位子上(和原来的第0个位子上的元素交换位置),然后再从剩下的N-1个元素中找到最小的放在第1个位子上,然后再从剩下的N-2个元素中找到最小的放在第2个位子…..直到所有的元素都就位。
选择排序
1 2 3 4 5 6 7 8 9 10
| def SelectionSort(a): n = len(a) for i in range(n - 1): for j in range(i, n): if a[i] > a[j]: a[i], a[j] = a[j], a[i] lst = [1, 12, 4, 56, 6, 2] SelectionSort(lst) print(lst)
|
选择排序:时间复杂度 $ O(n^2) $,即对有n个元素的列表(数组),需要做 $ n^2 $ 次比较
冒泡排序、插入排序时间复杂度都是$ O(n^2) $
好的排序算法,比如归并排序,快速排序,复杂度是$ O(nlog(n)) $
python自带的排序功能,复杂度是$ O(nlog(n)) $
可以认为排序这件事,复杂度就是$ O(n*log(n)) $
用排序函数对简单列表排序
简单顺序排序
a.sort()
可以对列表a从小到大排序,改变a的内存结构
sorted(a)
返回a经过从小到大排序后的新列表,a不变,创建新的列表
1 2 3 4 5 6 7
| a = [5, 7, 6, 3, 4, 1, 2] a.sort() a = [5, 7, 6, 3, 4, 1, 2] b = sorted(a) a = [25, 7, 16, 33, 4, 1, 2] a.sort(reverse = True) b = sorted(a, reverse = True)
|
默认多组对比顺序排列
元组比大小是按照元组需要比较
1 2 3 4 5 6 7
| students = [('John', 'A', 15), ('Mike', 'C', 19), ('Mike', 'B', 12), ('Mike', 'C', 18), ('Bom', 'D', 10)] students.sort() print(students)
|
自定义比较排序
自定义比较函数key
比较的不是元素本身,而是元素调用key的函数得到的返回值。
1 2 3 4 5 6 7 8 9 10
| def myKey(x): return x % 10
a = [25, 7, 16, 33, 4, 1, 2] a.sort(key = myKey)
sorted("This is a test string from Andrew".split(), key = str.lower)
|
复杂列表的自定义排序
1 2 3 4 5 6 7 8 9
| students = [('John', 'A', 15), ('Mike', 'B', 12), ('Mike', 'C', 18), ('Bom', 'D', 10)]
students.sort(key = lambda x : x[2])
students.sort(key = lambda x : x[0])
|
Iambda表达式
表示一个函数,参数是x,返回值是x[2]
1 2
| k = lambda x, y : x + y print(k(4, 5))
|
当关键字相同,排序前哪个在前面,排完之后就在前
多级排序
1 2 3 4 5
| def f(x): return (-x[2], x[1], x[0]) students = [('John', 'A', 15), ('Mike', 'C', 19), ('Wang', 'B', 12), ('Mike','B', 12), ('Mike', 'C', 12), ('Mike', 'C', 18), ('Bom', 'D', 10)] students.sort(key = f) print(students)
|
Python元组的排序
- 元组不能修改,因此无sort函数,可以用
sorted
得到新的排序后的列表
1 2 3 4 5 6
| def f(x): return (-x[2], x[1], x[0]) students = (('John', 'A', 15), ('Mike', 'C', 19), ('Wang', 'B', 12),('Mike', 'B', 12), ('Mike', 'C', 12), ('Mike', 'C', 18), ('Bom', 'D', 10))
print(sorted(students, key = f))
|
列表相关函数
append(x)
添加元素x到尾部
extend(x)
添加列表x中的元素到尾部
insert(i,x)
将元素x插入到下标i处
remove(x)
删除元素x
del(i)
删除下标为i的元素
reverse()
颠倒整个列表
index(x)
查找元素x,找到则返回第一次出现的下标,找不到则引发异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| a, b = [1, 2, 3], [5, 6] a.append(b) print(a)
b.insert(1, 100) print(a)
a.extend(b) print(a)
a.insert(1, 'K') print(a)
a.insert(3, 'K') print(a)
a.remove('K') print(a)
a.reverse() print(a)
print(a.index('K')) try: print(a.index('m')) except Exception as e: print(e)
|
列表映射
map(function, sequence)
, 可用于将一个序列(列表、元组、集合…)映射到另一个序列
- 返回一个延时求值对象,可以转换成
list
, tuple
, set
…
1 2 3 4 5 6 7 8 9 10 11 12 13
| def f(x): print(x, end="") return x * x
a = map(f, [1, 2, 3]) print(list(a))
print(tuple(a))
a = list(map(lambda x : 2 * x, [2, 3, 4])) print(a)
|
1 2 3 4 5
| x, y, z = map(int, input().split()) print(x, y, z)
输入:1 23 45 输出:1 23 45
|
列表过滤
filter(function, sequence)
,抽取序列中令function(x)
为True的元素x
- 返回一个延时求值对象,可以转换成
list
, tuple
, set
…
1 2 3 4 5
| def f(x): return x % 2 == 0
lst = tup1e(filter(f, [1, 2, 3, 4, 5])) print(lst)
|
列表生成式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [x * x for x in range(1, 11)]
[x * x for x in range(1, 11) if x % 2 == 0]
[m + n for m in 'ABC' for n in 'XYZ']
[[m + n for m in 'ABC'] for n in 'XYZ']
L = ['Hello', 'World', 18, 'Apple', None] [s.lower() for s in L if isinstance(s, str)]
[s for s in L if isinstance(s, int)]
|
元组生成式
1 2
| print(tuple(x * x for x in range (1, 11)))
|
二维列表
1 2 3 4 5 6 7
| a = [0, 0, 0] b = [a] * 3 print(b)
b[0][1] = 1 a[2] = 100 print(b)
|
1 2 3 4 5 6 7 8 9 10 11 12
| matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(matrix) print(matrix[1][2], matrix[2][2])
matrix[1][1] = 100 print(matrix)
matrix = [[0 for i in range(3)] for i in range (3)] print(matrix)
matrix = [[i * 3 + j for j in range(3)] for i in range (3) ] print(matrix)
|
1 2 3 4 5 6 7 8
| lst = [] for i in range(3): lst.append([0] * 4) lst[0][0] = lst[2][3] = 100 for i in range(3): for j in range(4): print(lst[i][j], end = " ") print("")
|
1 2 3
| 100 0 0 0 0 0 0 0 0 0 0 100
|
1 2 3 4 5
| matrix = ((1, 2, 3), (4, 5, 6), (7, 8, 9)) print(matrix)
matrix = tuple(tuple(0 for i in range(3)) for i in range(3)) print(matrix)
|
列表拷贝
1 2 3 4 5 6 7 8 9
| a = [1, 2, 3, 4] b = a[:] b[0] = 5 print(a) print(b)
b += [10] print(a) print(b)
|
列表深拷贝
1 2 3 4 5 6 7 8 9
| a = [1, [2]] b = a[:] b.append(4) print(a) print(b)
a[1].append(3) print(a) print(b)
|
未能进行深拷贝!
浅拷贝
:只拷贝指针,并没有拷贝指针指向的内容
深拷贝
:不仅拷贝指针,还拷贝指针指向的内容
1 2 3 4 5 6 7 8 9 10 11
| import copy
a= [1, [2]] b = copy.deepcopy(a) b.append(4) print(a) print(b)
a[1].append(3) print(a) print(b)
|
元组和列表互转
1 2 3 4 5 6 7 8 9
| a = [1, 2, 3] b = tuple(a) c = list(b)
t = (1, 3, 2) (a, b, c) = t
s = [1, 2, 3] [a, b, c] = s
|
元组、列表和字符串互转
1 2 3 4
| print(list("he1lo")) print("".join(['a', '44', 'c'])) print (tup1e ("hello") ) print("".join(('a', '44', 'c')))
|