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