Python学习笔记(六)列表
list
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型。
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。
比如,列出班里所有同学的名字,就可以用一个list表示:
1 >>> classmates = ['sky', 'eric', 'lzz']
2 >>> classmates
3 ['sky', 'eric', 'lzz']
变量classmates
就是一个list。用len()
函数可以获得list元素的个数:
1 >>> len(classmates)
2 3
与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。
1 >>> classmates[0]
2 'sky'
3 >>> classmates[1]
4 'eric'
5 >>> classmates[2]
6 'lzz'
7 >>> classmates[3]
8 Traceback (most recent call last):
9 File "<stdin>", line 1, in <module>
10 IndexError: list index out of range
当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1
。
如果要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素:
1 >>> classmates[-1]
2 'lzz'
以此类推,可以获取倒数第2个、倒数第3个:
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
1 >>> classmates.append('acer')
2 >>> classmates
3 ['sky', 'eric', 'lzz', 'acer']
也可以把元素插入到指定的位置,比如索引号为1
的位置:
1 >>> classmates.insert(1, 'admin')
2 >>> classmates
3 ['sky', 'admin', 'eric', 'lzz', 'acer']
要删除list末尾的元素,用pop()
方法:
1 >>> classmates.pop()
2 'acer'
3 >>> classmates
4 ['sky', 'admin', 'eric', 'lzz']
要删除指定位置的元素,用pop(i)
方法,其中i
是索引位置:
1 >>> classmates.pop(0)
2 'sky'
3 >>> classmates
4 ['admin', 'eric', 'lzz']
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
1 >>> classmates[1] = 'hugo'
2 >>> classmates
3 ['admin', 'hugo', 'lzz']
list里面的元素的数据类型也可以不同,也可以是另一个list
1 >>> lis = ['lzj', 121, ['ab', 'cd']]
2 >>> lis
3 ['lzj', 121, ['ab', 'cd']]
4 >>> lis[2]
5 ['ab', 'cd']
6 >>> lis[2][1]
7 'cd'
8 >>> len(lis)
9 3
可以使用 del 语句来删除列表的的元素
1 >>> del lis[2]
2 >>> lis
3 ['lzj', 121]
列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。
表达式 | 结果 | 描述 |
---|---|---|
len([1, 2, 3]) | 3 | 长度 |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 组合 |
['Hi!'] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 重复 |
3 in [1, 2, 3] | True | 元素是否存在于列表中 |
for x in [1, 2, 3]: print x, | 1 2 3 | 迭代 |
列表的函数和方法
序号 | 函数 |
---|---|
1 | cmp(list1, list2) 比较两个列表的元素 |
2 | len(list) 列表元素个数 |
3 | max(list) 返回列表元素最大值 |
4 | min(list) 返回列表元素最小值 |
5 | list(seq) 将元组转换为列表 |
序号 | 方法 |
---|---|
1 | list.append(obj) 在列表末尾添加新的对象 |
2 | list.count(obj) 统计某个元素在列表中出现的次数 |
3 | list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
4 | list.index(obj) 从列表中找出某个值第一个匹配项的索引位置 |
5 | list.insert(index, obj) 将对象插入列表 |
6 | list.pop(obj=list[-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
7 | list.remove(obj) 移除列表中某个值的第一个匹配项 |
8 | list.reverse() 反向列表中元素 |
9 | list.sort([func]) 对原列表进行排序 |
1.元素赋值
1 >>> lis = [1, 'a', 'eric']
2 >>> lis
3 [1, 'a', 'eric']
4 >>> lis[0] = 'python'
5 >>> lis
6 ['python', 'a', 'eric']
注意:通过lis[0]= 'python',如果原来位置上有值,会覆盖掉原来的。
2.分片操作
1)显示序列
1 >>> lis
2 ['python', 'a', 'eric']
3 >>>
4 >>> lis[1:2]
5 ['a']
6 >>> lis[1:]
7 ['a', 'eric']
8 >>> lis[:2]
9 ['python', 'a']
10 >>> lis[:]
11 ['python', 'a', 'eric']
注意:(1)lis[beg:end]将显示列表的从lis[beg]到lis[end-1]的元素,lis[end]不会显示
(2)lis[beg:end]省略beg,默认beg= 0; 省略end默认end = len(lis)。因此lis[:]显示整个列表。
2)修改序列
1 >>> lis
2 ['python', 'a', 'eric']
3 >>> lis[1:] = list('hello')
4 >>> lis
5 ['python', 'h', 'e', 'l', 'l', 'o']
3)插入序列
1 >>> lis
2 ['python', 'h', 'e', 'l', 'l', 'o']
3 >>> lis[2:2] = [1, 2, 3]
4 >>> lis
5 ['python', 'h', 1, 2, 3, 'e', 'l', 'l', 'o']
6 >>> lis[2:2] = 'love'
7 >>> lis
8 ['python', 'h', 'l', 'o', 'v', 'e', 1, 2, 3, 'e', 'l', 'l', 'o']
注意:往lis的某个位置插入列表或字串时,列表的每项、字串的每个字符都会作为lis的一个元素,而不会整体插入。
思考:那作为整体插入咋办?
1 >>> lis2
2 [2, 'x']
3 >>> lis2.insert(1, [7, 8, 9])
4 >>> lis2
5 [2, [7, 8, 9], 'x']
6 >>> lis2.insert(0, 'Hi')
7 >>> lis2
8 ['Hi', 2, [7, 8, 9], 'x']
4)删除序列
1 >>> lis
2 ['python', 'h', 'l', 'o', 'v', 'e', 1, 2, 3, 'e', 'l', 'l', 'o']
3 >>> lis.remove('h')
4 >>> lis
5 ['python', 'l', 'o', 'v', 'e', 1, 2, 3, 'e', 'l', 'l', 'o']
6 >>> del lis[-3:]
7 >>> lis
8 ['python', 'l', 'o', 'v', 'e', 1, 2, 3, 'e']
9 >>> lis[2:len(lis)] = []
10 >>> lis
11 ['python', 'h']
3.count函数
功能:统计列表中某元素出现的次数
1 >>> lis
2 ['python', 'l', 'o', 'v', 'e', 1, 2, 3, 'e']
3 >>> lis.count('e')
4 2
4.len函数
功能:统计列表中元素的个数
1 >>> lis
2 ['python', 'l', 'o', 'v', 'e', 1, 2, 3, 'e']
3 >>> len(lis)
4 9
5.append函数
功能:往列表的最后一个位置插入(入栈)操作
1 >>> lis2
2 ['Hi', 2, [7, 8, 9], 'x']
3 >>> lis2.append('bye')
4 >>> lis2
5 ['Hi', 2, [7, 8, 9], 'x', 'bye']
扩展:可以”+“号 来实现列表的相加
1 >>> a = ['a', 'v']
2 >>> c = ['e', 'w']
3 >>> a + c
4 ['a', 'v', 'e', 'w']
6.extend函数
功能:修改原序列,链接两个序列产生新的序列
1 >>> a.extend(c)
2 >>> a
3 ['a', 'v', 'e', 'w']
4 >>> c
5 ['e', 'w']
7.insert函数
功能:将元素插入到列表的指定位置
1 >>> lis2
2 [2, [7, 8, 9], 'x']
3 >>> lis2.insert(0, 'Hi')
4 >>> lis2
5 ['Hi', 2, [7, 8, 9], 'x']
8.pop函数
功能:删除指定位置元素
1 >>> lis2
2 ['Hi', 2, [7, 8, 9], 'x', 'bye']
3 >>> lis2.pop()
4 'bye'
5 >>> lis2
6 ['Hi', 2, [7, 8, 9], 'x']
7 >>> lis2.pop(0)
8 'Hi'
9 >>> lis2
10 [2, [7, 8, 9], 'x']
注意:pop(n),n指明在列表中的位置,如果pop(),默认弹出最后一个元素(出栈操作)。
9.remove函数
功能:删除第一个指定元素
1 >>> lis2
2 [2, [7, 8, 9], 'x']
3 >>> lis2.remove('x')
4 >>> lis2
5 [2, [7, 8, 9]]
思考:怎样删除所有的指定元素?
1 >>> lis3 = [1, 3, 4, 3, 2, 3]
2 >>> while 3 in lis3:
3 ... lis3.remove(3)
4 ...
5 >>> lis3
6 [1, 4, 2]
10.index函数
功能:从列表中找出与某个元素匹配的第一个匹配项的位置
1 >>> lis3 = [1, 3, 4, 3, 2, 3]
2 >>> lis3.index(3)
3 1
4 >>> lis3.index(4)
5 2
6 >>> lis3.index(5)
7 Traceback (most recent call last):
8 File "<stdin>", line 1, in <module>
9 ValueError: 5 is not in list
11.reverse函数
功能:翻转列表
1 >>> lis3
2 [1, 3, 4, 3, 2, 3]
3 >>> lis3.reverse()
4 >>> lis3
5 [3, 2, 3, 4, 3, 1]
12.sort函数
功能:队员列表进行排序
1 >>> lis4 = [5, 2, 9, 7, 3]
2 >>> lis4.sort()
3 >>> lis4
4 [2, 3, 5, 7, 9]
注意:sort函数修改了原序列,这里如果是采用b = a的方式,那么b和a指向同一个列表
1 >>> lis4 = [5, 2, 9, 7, 3]
2 >>> lis5 = lis4
3 >>> lis5.sort()
4 >>> lis4
5 [2, 3, 5, 7, 9]
6 >>> lis5
7 [2, 3, 5, 7, 9]
思考:那么如何不改变原序列呢?
方法一:可以利用sorted()函数
1 >>> lis6 = [3, 1, 7, 5]
2 >>> lis7 = sorted(lis6)
3 >>> lis6
4 [3, 1, 7, 5]
5 >>> lis7
6 [1, 3, 5, 7]
方法二:创建副本
1 >>> lis6
2 [3, 1, 7, 5]
3 >>> lis7 = lis6[:]
4 >>> lis7.sort()
5 >>> lis6
6 [3, 1, 7, 5]
7 >>> lis7
8 [1, 3, 5, 7]
注意: 对于列表a:
b = a 那么b和a都指向同一个列表
b = a[:] 那么吧创建了一个列表副本
关键字排序:key
长度(len)排序:
1 >>> lis8 = ['aa', 'abc', 'd', 'etgf', 'werwvadgbd']
2 >>> lis8.sort(key = len)
3 >>> lis8
4 ['d', 'aa', 'abc', 'etgf', 'werwvadgbd']
关键字排序:reverse()
1 >>> lis6
2 [3, 1, 7, 5]
3 >>> lis6.sort(reverse = True)
4 >>> lis6
5 [7, 5, 3, 1]
6 >>> lis6.sort(reverse = False)
7 >>> lis6
8 [1, 3, 5, 7]
注意:reverse = True 降序
reverse = False 升序
13.cmp函数
在Python3中,被function.cmp_to_key替换
14. set函数
功能:列出列表中不重复的元素(去重)集合
1 >>> lis3
2 [3, 2, 3, 4, 3, 1]
3 >>> lis9 = set(lis3)
4 >>> lis9
5 {1, 2, 3, 4}
6 >>> print(lis9)
7 {1, 2, 3, 4}
8 >>> lis9[1]
9 Traceback (most recent call last):
10 File "<stdin>", line 1, in <module>
11 TypeError: 'set' object does not support indexing
注意:利用set() 函数后就变成了集合,集合例元素无序,再利用list2[2]就出错了。