本文将介绍python中的容器类型,并将详细介绍其中的序列。
一、容器类型
所谓容器类型,就是用来存放和管理各种对象的类型,使用容器类型,就可以根据程序的需求把需要处理的复杂数据放到容器中,容器提供了一系列的方法,可以用来访问和管理这些数据。
容器类型可以分为两种:
1.序列容器,一般也被成为“顺序容器”,顾名思义,该容器是将存放的数据按顺序放置在内存区中的,如果一个新元素被插入或者已存元素被删除,其他在同一个内存块的元素就必须向上或向下移动来为新元素提供空间,或填充原来被删除的元素所占的空间,这种移动影响了效率。
2.关联容器,与序列容器不同,是根据每个节点来存放数据的,最典型的例子是字典类型,一个key值对应一个value值,容器元素的Haru或者删除只影响指向节点的指向,而不是节点自己的内容,所以当有数据插入或者删除时,元素值不需要移动。
3.分类
序列容器 | string | 字符串 |
unicode | | |
list | 列表 | |
tuple | 元组 | |
buffer | | |
range | | |
关联容器 | dict | 字典类型 |
set | 集合类型 |
二、序列常见类型
在介绍各类型之前,先引入两个pyhton的自省函数--help()和dir()
1.字符串(string)
(1)转义字符(图是网上的)
(2)字符串运算符
(3)字符串格式化
(4)字符串常见的内建函数
调用形式: string.function_1()
(a)大小写转换
首字符大写:capitalize()
单词首字符大写其他字符小写:title()
全部转换成大写:upper()
全部转换成小写:lower()
大小写互换:swapcase()
(b)字符串替换
把指定子字符串替换成指定子字符串:replace(old,new,count),count是指定共替换多少次。
过滤首尾指定字符串(直接去掉):strip("string")
a = "123412341"
print(a.strip("1"))
结果:2341234
从左/从右(首/尾)滤去指定字符串:lstrip("string")/rstrip("string")
a = "123412341"
print(a.rstrip("1"))
print(a.lstrip("1"))
结果:
12341234
23412341
用空格取代tab键:expandtabs(x),把字符串中tab键转换成x个空格。
(c)字符的分隔
split(“string”):根据指定的字符串将字符串截断成列表。
splitlines():根据换行符将字符串截断成列表。
str.partition(str):根据指定分隔符将字符串分隔成元组。
(d)字符串的搜索
从左向右查找,并返回找到的第一个字母的下标:find(str,start,end)
从右向左查找,并返回找到的第一个字母的下标:rfind(str,start,end)
类似find()的函数有:index(str,start,end)和rindex(str,start,end),不同的是:find()/rfind()搜索不到返回-1,而index()/rindex()所搜不到则报错。
cout(str,start,end):返回从开始搜索位置到结束搜索位置中,搜索到指定字符的次数。(值得注意的是:并不会重复查找,如下列代码,查找11时,第1,2个查找完后,会从第3个开始查找,而不会重复查找第2个,第3个1。
a = "11111"
print(a.count("1"))
print(a.count("11"))
print(a.count("111"))
print(a.count("1111"))
print(a.count("11111"))
结果:
5
2
1
1
1
PS: start:指定字符串中开始搜索的位置,end:指定字符串中结束搜索的位置,默认从最开始到最末尾。(这个位置是索引,也就是说可以用负索引来控制)
(e)字符的判断功能(isxxx())
(f)字符串的格式控制
其他的函数可以参考:
2.列表(list)
列表类似于C中的数组,C++中的vector,是用来“顺序存储”数据的容器。
(1)创建list:用[]声明是list,元素用‘,’隔开。
(2)访问list的元素:
通过下标索引访问list,方法与C中数组类似,从0开始到len(list)-1截止。区别是,list新增三个用法:
(a)list中元素类型可以不同,即
a = ['a',1,'\n']
是合法的,并不同于C/C++中数组是“相同类型元素的集合”。
(b)list支持负索引,即-1表示最后一个,-2表示倒数第二个。
(c)list支持切片用[]和:表示如下
a = [1,2,3,4,5]
b = a[2:4]
c = a[2:-1]
print(b)
print(c)
结果:
[3, 4]
[3, 4]
切片位置用下标表示,同样支持负索引,’:‘前默认值为0,从头开始;‘:’后默认值为len(list)-1,在最末 尾截止。值得注意的是:切片中指定开始的位置包括开始元素本身,但结束位置不包括结束元素本身。
(3)列表运算
加法(没有减法):list之间相加是“粘合”,相当于string1+string2;
支持+=;
乘法:list的乘法就是复制,list*x就是把list中元素按顺序复制x遍;
支持*=;
in判断 : x in a[....],用于判断x是否存在于列表a中,存在返回True否则返回Flase;
比较运算:<,>,<=,>=,==,!=
(4)list的方法(9个)
扩展列表元素:append()和extend()
a = [1,2,3,4,5,6,7]
b = ['a','b','c',1]
#append()在列表后面增加对象
a.append(b) #增加的对象是列表
print(a)
b.append(8) #增加的对象是int类型
print(b)
a = [1,2,3,4,5,6,7]
b = ['a','b','c',1]
#将一个序列对象转换成列表,并增加到该列表后面
a.extend('8')
print(a)
a.extend(b)
print(a)
#list1.extend(x)相当于是list1 + list(x)
结果:
[1, 2, 3, 4, 5, 6, 7, ['a', 'b', 'c', 1]]
['a', 'b', 'c', 1, 8]
[1, 2, 3, 4, 5, 6, 7, '8']
[1, 2, 3, 4, 5, 6, 7, '8', 'a', 'b', 'c', 1]
其他方法(index(),count(),pop(),insert(),remove(),reverse(),srot())外加一个计量长度的len():
a = [1,2,3,4,5,6,7]
b = ['a','b','c',1]
num = a.index(3)#返回查找值的第一个下标,若查找失败,则报错
print(num)
num = a.count(1)
print(num) #统计列表中该元素共有多少个
num = len(a)
print(num) #统计列表中一共有多少个元素
# print(a.insert(b,3))#将对象插入到指定下标的后面
print(a.pop())#弹出列表指定下标的元素。不指定下标时,默认弹出最后一个。
# #用pop()可模拟栈和队列
print(a.pop(0))
a.remove(2)
print(a)#删除列表指定的值,存在多个值则删除第一个
a.reverse()
print(a)#将列表元素顺序倒置
a.sort()
print(a)#sort()的排序方法可以自定义
结果:
2
1
7
7
1
[3, 4, 5, 6]
[6, 5, 4, 3]
[3, 4, 5, 6]
(5)list的内置函数:range(),filter(),map(),reduce()
(a)range(strat=0,stop,step=1):生成一个整型序列,从start(默认为0)开始,以step为间隔前进,直至到达或超 过stop(不包括stop)。
(b)filter():过滤函数,对列表进行过滤,只保留满足filter()函数条件的元素:
def f(x): return x % 2 == 0
a = list(filter(f,range(2,10)))
print(a)
结果:
[2,4,6,8]
(c)map()映射函数,将列表中每一个元素通过一个函数映射到map()函数的指定操作。
def cube(x): return x*x
a = list(map(cube,range(1,11)))
print(a)
结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
PS:map可以同时处理多个列表,前提是这些列表形状要相同。
(d)reduce(function,sequence,strating_value),它对item顺序迭代调用function,如果有strating_value,还可以作为初始值调用。
(6)列表推导式
一种更加简洁的列表生成形式,形如:[<expr1> for k in L if <expr2>]
3.list中extend()与append()用法的区别
网上有很多对这两个函数的区别讲解,但我觉得都讲的不是很清楚,记忆不深刻。这样解释清楚且容易记住。
list.append(object) 向列表中添加一个对象object
list.extend(sequence) 把一个序列seq的内容添加到列表中
1 2 3 4 5 |
|
使用append的时候,是将new_media看作一个对象,整体打包添加到music_media对象中。
1 2 3 4 5 |
|
使用extend的时候,是将new_media看作一个序列,将这个序列和music_media序列合并,并放在其后面。
参见:
4.元组(tuple)
(1)元组类型通过,一对()表示,元组是常量的list。是常量的list就意味着,与list有很大的相似,却又有不同。
通过help(tuple)我们知道,tuple与list操作基本相同,只是那些涉及更改自身元素的操作不被支持,list的9个方法也不被支持。
创建元组:
a = (1,2) #元组通过圆括号和逗号创建元组
b = (1,) #当通过一个元素创建元组时,必须带上逗号
(2)嵌套定义与访问
#嵌套的定义
a1 = (1,(1,2),3,4)#元组嵌套元组
a2 = (1,[1,2],3,4)#元组嵌套list(嵌套的list可变)
#嵌套的访问
b = a1[1][1]#用二维数组访问嵌套的tuple/list中的元素
print(b)
c = a2[1][0]#进一步更多重的嵌套用对应维数的下标访问元素
print(c)
结果:
2
1
(3)介绍zip()函数:
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]