1. 列表
对于python列表的理解可以和c语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且python的列表是比较强大的,它包含了很多不同类型的数据:整型数字,浮点型,字符串以及对象等。
不同于 c++ 和 java,在 python 中,没有在标准库中内置数组类型,而是通常利用列表来表示数组,同时它也比数组的使用要灵活得太多。
列表是 python 中最基本的数据结构,列表中的元素的存储是有序的,所以我们可以直接利用索引去访问列表中的值。在学习数据结构时,我们知道,对一个数据结构的操作,无外乎增删改查四种。接下来本文将从这四个方面来介绍列表的一些常用小技巧。
1.1. 列表中的增
对列表的增加操作有两种,一种是创建一个新的列表,一种是在一个已有的列表中增加一个新元素。我们首先介绍如何创建一个新的列表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 创建一个空列表 list1 = [] # 创建一个默认值为0,长度为n的列表 list2 = [ 0 ] * n # 利用列表生成式创建列表 list3 = [i for i in range ( 10 )] # 5*5 二维列表 list4 = [[i for i in range ( 5 )] for j in range ( 5 )] # 利用其他数据结构生成列表, list() 函数接收一个可迭代对象作为参数 tuple1 = ( 1 , 2 , 3 ) list5 = list (tuple1) # 字符串转化为列表 str1 = "i love code" # 每个元素作为列表中的一个元素 list6 = list (str1) # 按照指定字符分割 list7 = str1.split( " " ) # ['i', 'love', 'code'] |
在编程过程中,有时我们需要对一个列表进行操作,但是列表是一个可变对象,对列表的操作往往会改变其本来的顺序结构。因此,当我们不想改变列表原有的顺序结构,我们需要对旧的列表进行一个拷贝,然后在新的列表上进行操作。拷贝存在两种,浅拷贝和深拷贝。可能有人会对这两种拷贝存在疑问,他们得到的列表的形式不是一样的嘛?
是的,它们在拷贝后得到的列表形式确实是一样的。但是在进行操作时,就会有很大的差别了,特别是当你的列表中存在可变对象时。我们只需要记住一点,浅拷贝只复制不可变对象,而深拷贝不仅复制不可变对象,还复制了可变对象。以下进行举例说明:
1
2
3
4
5
6
7
8
9
10
11
|
# 如果一个列表中的元素都是不可变对象,可以直接用浅拷贝 list1 = [ 1 , 2 , 'i' ] list2 = list1[:: 1 ] # 浅拷贝 list3 = [i for i in list1] # 浅拷贝 import copy list4 = copy.copy(list1) # 浅拷贝 # 如果一个列表中的元素包含可变对象,要完成复制列表,需要用深拷贝 list5 = [ "will" , 1 , [ "python" , "java" , "c++" ]] list6 = copy.deepcopy(list5) |
为什么在包含不可变对象的时候,需要用到深拷贝呢?
上面我们说过,浅拷贝只拷贝不可变对象。当列表中存在可变对象时,我们可以发现其引用 id 是一样的,即它们是同一个对象,因此对 list5 的操作会影响到 list6 。而在深拷贝中,对于可变对象,在拷贝的新列表中会生成一个新的对象,所以对 list6 的修改不会影响到 list5 。
1
2
|
id (list5[ 2 ]) # 2195936916360 id (list6[ 2 ]) # 2195936916744 |
对列表的另一种增加操作就是在已有的列表的基础上增加元素了,主要包括以下几种操作:
1
2
3
4
5
6
7
8
9
|
list1 = [ "i" ] # 在列表尾部增加一个新元素 list1.append( "love" ) # 合并两个列表 list2 = [ "apple" , 3 ] list1.extend(list2) # ["i", "love", "apple", 3] list1 = list1 + list2 # ["i", "love", "apple", 3] # 在指定位置插入元素 list1.insert(index = 1 , "not" ) # ["i", "not", "love", "apple", 3] |
1.2. 列表中的删
对数据结构的删除操作包括两种,删除整个列表,或者删除列表中的某些元素。对于从内存中删除整个列表,该操作十分简单:
1
2
|
list1 = [ 1 , 2 , 3 ] del list1 |
对于删除列表中的元素,同样可以使用 del 语句,同时还可以使用 remove() 函数。
1
2
3
4
5
6
7
8
|
list1 = [ 1 , 2 , 3 ] print (list1) # [1, 2, 3] del list1[ 1 ] print (list1) # [1, 3] # 移除某个值的第一匹配项 list2 = [ 1 , 2 , 2 , 3 , 5 ] list2.remove( 2 ) # 移除第一个值为 2 的元素 |
1.3. 列表中的改
修改操作即在原有的列表的基础上对其进行修改,上面以及介绍了增加和删除操作,这里就对不改变元素的个数的操作进行介绍,主要包括排序和反转列表等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 对一个整数列表进行排序 list1 = [ 9 , 5 , 6 , 2 , 7 , 1 , 3 ] # 升序排列 list1.sort() # [1, 2, 3, 5, 6, 7, 9] list1 = sorted (list1) # [1, 2, 3, 5, 6, 7, 9] # 降序排列 list1.sort(reverse = true) # [9, 7, 6, 5, 3, 2, 1] list1 = sorted (list1, reverse = true) # [9, 7, 6, 5, 3, 2, 1] # 指定键值排序 list1 = [( 'a' , 3 ), ( 'b' , 2 ), ( 'c' , 1 )] list1.sort(key = lambda x:x[ 1 ]) # [('c', 1), ('b', 2), ('a', 3)] ## 反转列表,即将原来的列表逆序排列 list2 = [ 4 , 2 , 3 , 1 ] list2 = list2[:: - 1 ] # [1, 3, 2, 4] list2.reverse() # [1, 3, 2, 4] |
1.4. 列表中的查
对列表的查找操作无外乎以下几种:
- 遍历列表;
- 查找指定索引的元素;
- 查找指定值的元素;
列表的遍历方式有三种,分别是根据索引遍历、根据值遍历和 enumerate()遍历。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
list1 = [ "python" , "c++" , "java" ] # 方法 1 for i in range ( len (list1)): print (list1[i]) # 方法 2 , 遍历速度最高效,但是无法记录索引 for i in list1: print (i) # 方法 3 for index, val in enumerate (list1): print (val) |
查找元素有两种,一种是按照索引查找,一种是遍历按值查找。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 查找指定索引的元素 list1 = [ 1 , 3 , 2 , 5 , 7 , 8 ] list1[ 3 ] # 返回索引为 3 的元素,值为5 # 查找指定值的元素 key = 5 for i in list1: if i = = key: print ( "ok" ) # 查找最大元素和最小元素 max (list1) # 8 min (list1) # 1 |
1.5. 其它小技巧
上述介绍了列表的增删改查四种常用操作,当然对列表的操作不仅仅只有这些,例如还有两个列表的比较,列表结构的转化等等。
比较两个列表是否是一样的,这里的前提条件是这两个列表对象不是同一个对象。
1
2
3
4
5
6
7
8
9
10
11
12
|
list5 = [( "car" , 1 ), ( "bike" , 2 ), ( "foot" , 3 )] list6 = [( "car" , 1 ), ( "bike" , 2 ), ( "foot" , 3 )] # 判断两个列表是否是同一个对象 list5 is list6 # false # 判断两个列表是否相等 list5 = = list6 # true # 当列表中的元素很多,且结构复杂时,可以使用 numpy 模块 import numpy as np a = np.array(list5) b = np.array(list6) (a = = b). all () # true |
列表结构的转化主要包括将列表转化为元组、集合、字符串和字典:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
list1 = [ "a" , "b" , "c" , "d" , "c" ] # 列表转化为元组 tuple1 = tuple (list1) # ('a', 'b', 'c', 'd', 'c') # 列表转化为集合 set1 = set (list1) # {'a', 'b', 'c', 'd'} # 列表转化为字符串 str1 = "".join(list1) # 'abcdc' # 列表转化为字典,元素为 key, 次数为 value from collections import counter, defaultdict dict1 = counter(list1) # counter({'a': 1, 'b': 1, 'c': 2, 'd': 1}) # 或者 dict2 = defaultdict( int ) for i in list1: dict2[i] + = 1 dict2 # defaultdict(int, {'a': 1, 'b': 1, 'c': 2, 'd': 1}) |
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。
原文链接:https://segmentfault.com/a/1190000019363222