day11:python学习笔记03(序列)

本文详细介绍了Python中的四种主要序列类型——列表、元组、字典和集合的基本操作,包括创建、增加、删除元素、访问、计数以及排序方法。强调了它们之间的区别和各自的特点,如列表的可变性、元组的不可变性、字典的键值对以及集合的无序和唯一性。
摘要由CSDN通过智能技术生成

序列是一种数据存储方式,用来存储一系列的数据;在内存中,序列就是一块用来存放多个值的连续的内存空间;序列中存储的是整数对象的地址,而不是整数对象的值,常用的序列结构有:字符串、列表、元组、字典、集合。

列表

用于存储任意数目、任意类型的数据集合。列表是内置可变序列,是包含多个元素的有序连续的内存空间。

创建
  1. a = [10,20,‘gaoqi’,‘sxt’],也可以a = [] ,创建一个空的对象;

  2. list()可以将任何可迭代的数据转化成列表。a = list() a = list(range(10)) 则a = [0, 1,
    2, 3, 4, 5, 6, 7, 8, 9]

  3. range()创建整数列表:range()可以帮助我们非常方便的创建整数列表,range([start,] end
    [,step]),range()返回的是一个range对象,而不是列表。range([start,] end
    [,step]),start参数:可选,表示起始数字。默认是0;end参数:必选,表示结尾数字。;step参数:可选,表示步长,默认为1。

  4. 推导式生成列表:使用列表推导式可以非常方便的创建列表。

>>> list(range(3,15,2))
[3, 5, 7, 9, 11, 13]
>>> list(range(15,3,-1))
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4]
>>> a = [x*2  for  x  in range(5)]    #循环创建多个元素
>>> a
[0, 2, 4, 6, 8]
>>> a = [x*2 for x in range(100) if x%9==0]     #通过if过滤元素
>>> a
[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]

列表增加和删除元素时,列表会自动进行内存管理,涉及列表元素的大量移动,效率较低。一般只在列表的尾部添加元素或删除元素,这会大大提高列表的操作效率。

列表元素的增加

append()原地修改列表对象,是真正的列表尾部添加新的元素,速度最快。

>>> a = [20,40]   >>> a.append(80)

+运算符:并不是真正的尾部添加元素,而是创建新的列表对象,涉及大量的复制操作,对于操作大量元素不建议使用。

extend():将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。(直接添加列表)。

>>>a = [20,40]    >>>a.extend([50,60])

insert():使用insert()方法可以将指定的元素插入到列表对象的任意制定位置,插入位置后面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。

>>> a = [10,20,30]    >>>a.insert(2,100)

乘法扩展:使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。 a = [‘sxt’,100] b = a*3 所以b=[‘sxt’, 100, ‘sxt’, 100, ‘sxt’, 100] 适用于乘法操作的,还有:字符串、元组

列表元素的删除

del删除:删除列表指定位置的元素,会涉及大量元素的移动

>>> a = [100,200,888,300,400]     >>> del a[1]   

pop()方法:删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。a.pop()删除最后一个元素,a.pop(1)删除索引为1的元素;会涉及大量元素的移动

remove():删除首次出现的指定元素,若不存在该元素则抛出异常。

列表元素访问和计数

通过索引:索引的区间在[0, 列表长度-1]这个范围。超过这个范围则会抛出异常。
index():获取指定元素首次出现的索引位置。index(value,[start,[end]])

>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.index(20)
1
>>> a.index(20,3)
5
>>> a.index(20,3)   #从索引位置3开始往后搜索的第一个20
5
>>> a.index(30,5,7)  #从索引位置5到7这个区间,第一次出现30元素的位置
6

count():获得指定元素在列表中出现的次数

len():返回列表长度,列表包含元素的个数

成员资格判断:判断列表中是否存在指定的元素,我们可以使用count()方法,返回0则表示不存在,返回大于0则表示存在。但是,一般我们会使用更加简洁的in关键字来判断,直接返回True或False。

切片操作:切片slice操作可以让我们快速提取子列表或修改。标准格式为:[起始偏移量start:终止偏移量end[:步长step]],切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成”长度-1”。

列表的遍历:for i in a:print(i)

复制列表所有元素到新列表对象:list1 = [30,40,50] list2 = list1,只是将list2也指向了列表对象。可以通过如下实现列表元素内容复制:list1 = [30,40,50] list2 = [] + list1

列表排序

修改原列表,不建立新列表的排序

>>> a = [20,10,30,40]
>>> id(a)
46017416
>>> a.sort()         #默认是升序排列
>>> a
[10, 20, 30, 40]
>>> a = [10,20,30,40]
>>> a.sort(reverse=True)    #降序排列
>>> a
[40, 30, 20, 10]
>>> import random
>>> random.shuffle(a)    #打乱顺序
>>> a
[20, 40, 30, 10]

建立新列表的排序:生成的列表对象b和c都是完全新的列表对象。

>>> a = [20,10,30,40]
>>> id(a)
46016008
>>> a = sorted(a)          #默认升序
>>> a
[10, 20, 30, 40]
>>> id(a)
45907848
>>> a = [20,10,30,40]
>>> id(a)
45840584
>>> b = sorted(a)
>>> b
[10, 20, 30, 40]
>>> id(a)
45840584
>>> id(b)
46016072
>>> c = sorted(a,reverse=True)    #降序
>>> c
[40, 30, 20, 10]

reversed()返回迭代器:内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。我们打印输出c发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用list©进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。

>>> a = [20,10,30,40]
>>> c = reversed(a)
>>> c
<list_reverseiterator object at 0x0000000002BCCEB8>
>>> list(c)
[40, 30, 10, 20]
>>> list(c)
[]

max()和min(),用于返回列表中最大值和最小值;sum():对数值型列表的所有元素进行求和操作,对非数值型列表运算则会报错。
多维列表:一维列表可以帮助我们存储一维、线性的数据。 二维列表可以帮助我们存储二维、表格的数据。

a = [
        ["高小一",18,30000,"北京"],
        ["高小二",19,20000,"上海"],
        ["高小一",20,10000,"深圳"],
    ]
for m in range(3):
    for n in range(4):
        print(a[m][n],end="\t")
    print() #打印完一行,换行

在这里插入图片描述

元组

列表属于可变序列,可以任意修改列表中的元素。元组属于不可变序列,不能修改元组中的元素,因此元组没有增加元素、修改元素、删除元素等方法。

元组的创建

如果你使用逗号分隔了一些值,就会自动创建元组。
1、通过()创建元组。小括号可以省略。 a = (10,20,30),a = 10,20,30 如果元组只有一个元素,则必须后面加逗号。这是因为解释器会把(1)解释为整数1,(1,)解释为元组。
2.、通过tuple()创建元组,tuple可以接受列表、字符串、其他序列类型、迭代器生成元组,list()可以接受元组、字符串、其他序列类型、迭代器等生成列表。

元组的元素访问和计数

1、元组的元素不能修改,否则报错
2、元组的元素访问和列表一样,只不过返回的是元组对象
3、列表关于排序的方法list.sorted()是修改原列表对象,元组没有该方法,如果要对元组排序,只能使用内置函数sorted(tupleObj)并生成新的列表对象。

>>> a = (20,10,30,9,8)
>>> a[1]
10
>>> a[1:3]
(10, 30)
>>> a[:4]
(20, 10, 30, 9)

>>> sorted(a)
[8, 9, 10, 20, 30]

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)]

>>>a = (1,2,3)
>>>b = (4,5,6)
>>>a + b 
#(1,2,3,4,5,6)
元组的删除

元组中的元素值不允许删除,但可以使用del语句删除整个元组,元组被删除后,输出变量会有异常信息,输出结果告诉我们field没有定义,即field已经不存在了。

>>> field = ('hello', 'world') 
>>> del field 
>>> print('删除后的结果:',field) 
Traceback (most recent call last): File "<pyshell#84>", line 1, in <module> print('删除后的结果:',field) NameError: name 'field' is not defined 
生成器推导式创建元组

列表推导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象。可以通过生成器对象,转化成列表或者元组。也可以使用生成器对象的__next__()方法进行遍历

>>> s = (x*2 for x in range(5))
>>> s
<generator object <genexpr> at 0x0000000002BDEB48>
>>> tuple(s)
(0, 2, 4, 6, 8)
>>> list(s)         #只能访问一次元素。第二次就为空了。需要再生成一次
[]
>>> s
<generator object <genexpr> at 0x0000000002BDEB48>
>>> tuple(s)
()
>>> s = (x*2 for x in range(5))
>>> s.__next__()
0
>>> s.__next__()
2
>>> s.__next__()
4
元组的总结

1、核心特点:不可变序列
2、元组的访问和处理速度比列表快。
3、与整数和字符串一样,元组可以作为字典的键,列表永远不能作为字典的键使用
元组和列表的区别:
列表与元组的区别在于元组的元素不能修改,元组一旦初始化就不能修改。

>>> t = ('a', 'b', ['A', 'B']) 
>>> t[2][0] = 'X' 
>>> t[2][1] = 'Y' 
>>> t 
('a', 'b', ['X', 'Y']) 

在这里插入图片描述

字典

“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。键是任意的不可变数据,比如整数、浮点数、字符串、元组,但是列表、字典、集合这些可变对象,不能作为键,且键不可重复。值可以是任意的数据,并且可重复。比如:a = {'name':'zmx','age':18,'job':'programmer'}

字典的创建

1、可以通过{}、dict()来创建字典对象
2、通过zip()来创建字典对象
3、通过fromkeys创建值为空的字典

>>>a = {'name':'zmx','age':18,'job':'programmer'}
>>> b = dict(name='zmx',age=18,job='programmer')
>>> c = {}   #空的字典对象
>>> d = dict()   #空的字典对象

>>> key = ['name','age','job']
>>> value = ['zmx',18,'programmer']
>>> dd = dict(zip(key,value))
>>> dd
{'name': 'zmx', 'age': 18, 'job': 'programmer'}

>>> a = dict.fromkeys(['name','age','job'])
>>> a
{'name': None, 'age': None, 'job': None}
字典元素的访问

1、通过键获得值,键不存在则抛出异常
2、通过get()方法获得值,指定键不存在返回None,也可以设定指定键不存在时默认返回的对象
3、列出所有的键值对
4、列出所有的键,列出所有的值
5、len()键值对的个数
6、检测一个键是否在字典中

>>>a = {'name':'zmx','age':18,'job':'programmer'}
>>> a['age']
18

>>> dd.get('name')
'zmx'
>>> dd.get('sex')
>>> dd.get('sex','女')

>>> dd.items()
dict_items([('name', 'zmx'), ('age', 18), ('job', 'programmer')])
>>> dd.keys()
dict_keys(['name', 'age', 'job'])
>>> dd.values()
dict_values(['zmx', 18, 'programmer'])

>>> len(dd)
3
>>> 'name' in dd
True
字典元素的添加、修改、删除
  1. 给字典新增“键值对”。如果“键”已经存在,则覆盖旧的键值对;如果“键”不存在,则新增“键值对”。
  2. 使用update()将新字典中所有键值对全部添加到旧字典对象上。如果key有重复,则直接覆盖。
  3. 字典中元素的删除,可以使用del()方法;或者clear()删除所有键值对;pop()删除指定键值对,并返回对应的“值对象”;
  4. popitem() 随机删除和返回该键值对。字典是“无序可变序列”,因此没有第一个元素、最后一个元素的概念,
>>> dd
{'name': 'zmx', 'age': 18, 'job': 'programmer'}
>>> dd['address'] = '北京'

>>> dd['age'] = 10
>>> dd
{'name': 'zmx', 'age': 10, 'job': 'programmer', 'address': '北京'}

>>> cc = dict(name = 'zzz',sex = '女')
>>> dd
{'name': 'zmx', 'age': 10, 'job': 'programmer', 'address': '北京'}
>>> cc.update(dd)
>>> cc
{'name': 'zmx', 'sex': '女', 'age': 10, 'job': 'programmer', 'address': '北京'}

>>> dd
{'name': 'zmx', 'age': 10, 'job': 'programmer', 'address': '北京'}
>>> del(dd['name'])
>>> dd
{'age': 10, 'job': 'programmer', 'address': '北京'}
>>> dd.pop('age')
10
>>> dd.clear()
>>> dd
{}
>>> cc
{'name': 'zmx', 'sex': '女', 'age': 10, 'job': 'programmer', 'address': '北京'}
>>> cc.popitem()
('address', '北京')
>>> cc.popitem()
('job', 'programmer')
>>> cc
{'name': 'zmx', 'sex': '女', 'age': 10}
序列解包

序列解包可以用于元组、列表、字典。序列解包可以让我们方便的对多个变量赋值。序列解包用于字典时,默认是对键进行操作,如果需要对键值对操作,则需要使用items(),如果需要对值进行操作,则需要使用values()

>>> s = {'name':'zzz','age':23}
>>> name,age = s
>>> name
'name'
>>> name,age = s.items()
>>> name
('name', 'zzz')
>>> name,age = s.values()
>>> name
'zzz'

表格数据使用字典和列表存储,并实现访问:

>>> r1 = {'name':'zmx','age':23,'salary':3000}
>>> r2 = {'name':'zzz','age':18,'salary':4000}
>>> r3 = {'name':'ddd','age':14,'salary':5000}
>>> tb = [r1,r2,r3]
>>> print(tb[1].get('salary'))
4000
>>> for i in range(len(tb)):print(tb[i].get('salary'))

3000
4000
5000
>>> for i in range(len(tb)):print(tb[i].get('name'),tb[i].get('age'),tb[i].get('salary'))

zmx 23 3000
zzz 18 4000
ddd 14 5000
字典和列表的区别

例如以一个名字查找对应的学号,如果用list实现,就要先在名字列表中找到对应的名字,再从学号列表取出对应的学号,list越长耗时越长。如果用dict实现,只需要一个名字和学号的对照表,就可以直接根据名字查找学号,无论这个表有多大,查找速度都不会变慢。
dict的特点是: (dict内部存放的顺序和键放入顺序没有关系)
(1)查找和插入的速度极快,不会随着key的增加而变慢。
(2)需要占用大量内存,内存浪费多。
list的特点是:
(1)查找和插入时间随着元素的增加而增加。
(2)占用空间小,浪费内存很少。

集合

集合是无序可变,元素不能重复

创建和删除

1、使用{}创建集合对象,并使用add()方法添加元素
2、使用set(),将列表、元组等可迭代对象转成集合,如果原来数据存在重复数据,则只保留一个
3、 remove()删除指定元素;clear()清空整个集合

>>> a = {2,3,4}
>>> a
{2, 3, 4}
>>> a.add(9)
>>> a
{9, 2, 3, 4}

>>> a = ['a','b','c','b']
>>> b = set(a)
>>> b
{'b', 'a', 'c'}

>>> a = {10,20,30}
>>> a.remove(20)
>>> a
{10, 30}
>>> a.clear()
>>> a
set()
集合相关操作

集合也提供了并集、交集、差集等运算

>>> a = {1,3,'sxt'}
>>> b = {'he','it','sxt'}
>>> a|b                    #并集
{1, 3, 'sxt', 'he', 'it'}
>>> a&b                    #交集
{'sxt'}
>>> a-b                    #差集
{1, 3}
>>> a.union(b)                #并集
{1, 3, 'sxt', 'he', 'it'}
>>> a.intersection(b)                #交集
{'sxt'}
>>> a.difference(b)            #差集
{1, 3} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值