3 序列
序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列就是一块用来存放多个值的连续的内存空间。
序列中存储的是整数对象的地址,,而不是整数对象的值。
python中常用的序列结构有:
字符串、列表、元组、字典、集合
列表
列表:用于存储任意数目、任意类型的数据集合。
列表是内置可变序列,是包含多个元素的有序连续的内存空间。
列表定义的标准语法格式:
a=[10,20,30,40]
其中,10,20,30,40这些称为:列表a的元素。
列表中的元素可以各不相同,可以是任意类型。
字符串和列表都是序列类型,一个字符串是一个字符序列,一个列表是任何元素的序列
列表的创建
基本语法[]创建
list()创建
使用list()可以将任何可迭代的数据转化成列表。
range()创建整数列表
range()可以帮助我们非常方便的创建整数列表,这在开发中及其有用。语法格式为:range([start,]end[,step])
start参数:可选,表示起始数字。默认是0
end参数:必选,表示结尾数字。
step参数:可选,表示步长,默认为1
python3中range()返回的是一个range对象,而不是列表。我们需要通过list()方法将其转换成列表对象。
推导式生成列表
>>>a=[x*2 for x in range(5)]#循环创建多个元素
>>>a
[0,2,4,6,8]
>>>a=[x*2 forx in range(100) if x%9==0]#通过if过滤元素
>>>a
[0,18,36,54,72,90,108,126,144,162,180,198]
列表元素的增加
当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要,我们一般只在列表的尾部添加元素或删除元素,这会大大提高列表的操作效率。
append()方法
原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。
+运算符操作
并不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次复制到新的列表对象中。这样,会涉及大量的复制操作,对于操作大量元素不建议使用。
extend()方法
将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。
insert()插入元素
>>>a=[10,20,30]
>>>a.insert(2,100)
>>>a
[10,20,100,30]
乘法扩展
使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。
适用于乘法操作的,还有:字符串、元组
列表元素的删除
del删除删除列表指定位置的元素。
del a[1]
pop()方法
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。
a.pop(1)
remove()方法
删除首次出现的指定元素,若不存在该元素抛出异常。
列表元素访问和计数
通过索引直接访问元素[]
索引的区间在[0,列表长度-1]这个范围。超过这个范围则会抛出异常。
index()获得指定元素在列表中首次出现的索引
index()可以获取指定元素首次出现的索引位置。语法是:index(value,[start,[end]])。其中,start和end指定了搜索的范围。
count()获得指定元素在列表中出现的次数
len()返回列表长度
成员资格判断
判断列表中是否存在指定的元素,我们可以使用count()方法,返回0则表示不存在,返回大于0则表示存在。但是,一般我们会使用更加简洁的in/not in 关键字来判断,直接返回True或False。
切片操作
切片slice操作可以让我们快速提取子列表或修改。标准格式为:
[起始偏移量start:终止偏移量end[:步长step]]
切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。
列表排序
修改原列表,不建新列表的排序
a.sort() #默认是升序排列
a.sort(reverse=True) #降序排列
import random
random.shuffle(a )#打乱顺序
建新列表的排序
通过内置函数sorted()进行排序,这个方法返回新列表,不对原列表做修改。
a = sorted(a) #默认升序
c=sorted(a,reverse=True) #降序
reversed()返回迭代器
内置函数reversed()也支持进行逆序排列,与列表对象reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。
>>>a=[20,10,30,40]
>>>c=reversed(a)
>>>c
<list_reverseiteratorobjectat0x0000000002BCCEB8>
>>>list(c)
[40,30,10,20]
>>>list(c)
[]
打印输出c发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用list©进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。
列表相关的其他内置函数汇总
max和min
sum
多维列表
一维列表可以帮助我们存储一维、线性的数据。
二维列表可以帮助我们存储二维、表格的数据。
a=[
["高小一",18,30000,"北京"],
["高小二",19,20000,"上海"],
["高小一",20,10000,"深圳"],
]
print(a[1][0],a[1][1],a[1][2])
高小二1920000
a=[
["高小一",18,30000,"北京"],
["高小二",19,20000,"上海"],
["高小一",20,10000,"深圳"],
]
forminrange(3):
forninrange(4):
print(a[m][n],end="\t")
print()#打印完一行,换行
元组tuple
列表属于可变序列,可以任意修改列表中的元素。元组属于不可变序列,不能修改元组中的元素。因此,元组没有增加元素、修改元素、删除元素相关的方法
元组支持如
下操作:
1.索引访问
2.切片操作
3.连接操作
4.成员关系操作
5.比较运算操作
6.计数:元组长度len()、最大值max()、最小值min()、求和sum()等。
元组的创建
1.通过()创建元组。小括号可以省略。如果元组只有一个元素,则必须后面加逗号。
2.通过tuple()创建元组
tuple(可迭代的对象)
总结:
tuple()可以接收列表、字符串、其他序列类型、迭代器等生成元组。
list()可以接收元组、字符串、其他序列类型、迭代器等生成列表。
元组的元素访问和计数
1.元组的元素不能修改
2.元组的元素访问和列表一样,只不过返回的仍然是元组对象
3.列表关于排序的方法list.sorted()是修改原列表对象,元组没有该方法。如果要对元组排
序,只能使用内置函数sorted(tupleObj),并生成新的列表对象。sorted(a)
zip
zip(列表1,列表2,…)将多个列表对应位置的元素组合成为元组,并返回这个zip对象
>>>a=[10,20,30]
>>>b=[40,50,60]
>>>c=[70,80,90]
>>>d=zip(a,b,c)
>>>list(d)
[(10,40,70),(20,50,80),(30,60,90)]
生成器推导式创建元组
可以使用生成器对象的__next__()
方法进行遍历,
>>>s=(x*2forxinrange(5))
>>>s
<generatorobject<genexpr>at0x0000000002BDEB48>
>>>tuple(s)
(0,2,4,6,8)
>>>list(s)#只能访问一次元素。第二次就为空了。需要再生成一次
[]
>>>s
<generatorobject<genexpr>at0x0000000002BDEB48>
>>>tuple(s)
()
>>>s=(x*2forxinrange(5))
>>>s.__next__()
0
>>>s.__next__()
2
>>>s.__next__()
4