目录
数据容器是一种可以容纳多份数据的类型,容纳的每一份数据成为此数据容器的一个元素,根据数据容器是否支持重复元素,是否可以修改,是否有序等等特点可以把数据容器分成五类,分别为列表list,元组tuple,字符串str,集合set,字典dict。
列表
列表的创建
列表的创建使用的是中括号[],把不同的元素之间以逗号隔开即可。列表中的元素可以是不同的类型,比如元素1是数值型,元素2是字符串,甚至可以是另一个列表。如果想要把创建的列表存起来,直接使用一个变量进行接收即可。修改列表中的元素,语法为列表[下标]=值。
列表的下标索引
在Python中,列表中元素的下标是从零开始逐渐递增的。既然每一个元素都唯一的被他的下标确定,我们当然可以使用下标来拿到对应的元素,语法就是列表名[下标索引],比如
这样就可以提取到下标为1的元素也就是lisi
可以发现列表的创建和下标索引都是使用的[]操作符。
除了正向的索引标记,Python中还提供了倒着的索引,如图
可以看到最后一个元素的下标是-1,因此如果我们要在下面的列表中提取wangwu也就是最后一个元素,可以这样写
运行结果为wangwu,在实际应用中,如果需要倒着取出某些元素,可以使用这样的下标索引方式。
前面我们说过可以列表的常见可以是嵌套的,也就是说列表中的元素仍然可以是列表,如果我们想要提取到作为元素的列表中的元素,需要用到多个[],如图
假如我们要提取下面代码中name_list列表中2这个元素,就要写成这样
其中name_list[0]代表提取到name_list列表的第一个元素也就是[1,2,3]这个列表,然后再次使用[1]就可以提取到[1,2,3]这个列表中下标为1的元素也就是2了。
除了定义列表和使用下标索引获得取值,列表也提供了一系列功能比如:
插入元素,删除元素,清空列表,修改元素,统计元素个数等等功能,这些功能我们都称之为:列表的方法。方法这个名词可不是我们为了方便描述起的,这是Python中的专业术语。在Python中,如果将函数定义为class(类)的成员,那么函数会称之为:方法。
比如定义函数是这样的
定义方法是这样的,也就是把前面对函数的定义写在了一个class Student里面,这里的Student被称为‘类’
方法和函数功能一样, 有传入参数,有返回值,只是方法的使用格式不同:调用函数add直接写num=add(1,2)即可,调用方法add需要先指明这个方法属于什么类,写成
student=Student()
num=student.add(1,2)
调用‘类’中的方法就好像C语言中调用结构体类型变量中的成员变量。
在Python中对于列表这种数据类型已经自带了很多的‘方法’,比如找查某个元素在列表内的下标,使用的是Python中列表类型自带的方法index,格式为列表.indnex(元素),如图
运行结果为1,也就是haha的下标。如果查不到对应的元素,则会报错。
插入元素
语法:列表.insert(下标,元素),表示在指定的下标位置插入指定的元素。
如果我们要在下标为1和下标为2的元素之间插入一个元素,由于插入之后这个元素的下标将会是2,所以我们在使用方法insert的时候下标就要指定为2。如图是一个插入元素的例子
运行结果为
追加元素
语法:列表.append(元素),表示将指定元素追加到列表的尾部
如图是一个追加元素的例子
运行结果为
注:使用方法append只能追加一个元素,如果要追加多个元素,应该使用extend方法,其语法为列表.extend(其他数据容器),表示将其他数据容器中的元素取出依次追加到列表的尾部。这里的其他数据容器可以是一个已经存储了某个数据容器内容的变量,也可以是直接创建的数据容器,如图
或者使用变量作为其他数据容器
两种写法的运行结果均为
删除元素
删除元素有多种方法
1.del列表[下标]
运行结果
这种写法只能把指定的元素删除,但是删除的元素就是删除了,没法把删除的元素存起来。
2.列表.pop(下标)
运行结果
实际上使用方法pop的时候顾名思义是把某个元素弹出去,也就是说这里的返回值就是我们要删除的元素,我们可以使用变量把这个元素存起来。比如x=my_list.pop(1),此时变量x的值就是haha了
3.列表.remove(元素),表示删除某元素在列表中的第一个匹配项。
运行结果为
使用方法remove删除元素的原理是remove会从前往后去遍历整个列表并删除第一个匹配项,使用这种方法一次只能删除一个元素。同时这种方法也没有返回值,不能使用变量来接收返回值,硬要接收的话接收到的值将会是None
清空列表
语法:列表.clear()
使用这种方法清空列表不需要传入参数
统计某元素在列表中的数量
语法:列表.count(某元素),表示列表中有多少个‘某元素’,个数以返回值的形式给出,可以使用变量来接收,也可以直接打印观察,如图
使用变量接收
两种写法运行结果为2,表示列表中有两个2
统计列表中共有多少个元素
这种操作依赖的就不是‘方法’了,直接使用库函数len即可,语法为len(列表)
总结:
对列表的操作
可以发现除了删除列表中的del 列表[]和列表.pop()中使用的是下标,其余的方法()中用的都是内容也就是元素或者容器,在记忆的时候可以把删除的操作记作列表.remove,这样对列表的所有操作的方法中的()均是内容了。除了del列表[下标]之外,
列表的特点
1.可以容纳多个元素(上限为2**63-1、9223372036854775807个)
2.可以容纳不同类型的元素(混装)
3.数据是有序存储的(有下标序号)
4.允许重复数据存在
5.可以修改(增加或删除元素等)
如何遍历列表的元素?
将容器内的元素依次取出进行处理的行为成为遍历或者迭代,通常是需要借助循环来实现遍历列表的。如图
或者使用for循环
while循环和for循环,都是循环语句,但细节不同:
在循环控制上:
while循环可以自定循环条件,并自行控制
for循环不可以自定循环条件,只可以一个个从容器内取出数据
在无限循环上:
while循环可以通过条件控制做到无限循环
for循环理论上不可以,因为被遍历的容器容量不是无限的
在使用场景上:
while循环适用于任何想要循环的场景
for循环适用于遍历数据容器的场景或简单的固定次数循环场景,虽然有这样的限制,但是在实际应用的时候因为for循环的简单性,大部分场景还是用的for循环
遍历的应用:取出列表中的所有偶数构成一个新列表
运行结果如图
元组(tuple)
前面已经介绍过了列表而且知道了列表是可以被修改的,如果我们在实际应用的时候不想让传递的信息被修改,使用列表就不够安全了,因此Python中提供了一种新的数据类型叫做元组,元组与列表最大的不同在于元组一旦定义完成就无法被修改,可以把元组理解成一个只读的列表。同一个元组也可以存放不同类型的元素。
元组的定义
元组定义使用的是小括号,不同元素之间使用逗号隔开,不同元素可以是不同类型。格式如下
注意如果我们要定义一个只有一个元素的元组,应该在第一个元素后面再加一个逗号,举个例子
我们使用小括号表示想要定义一个元组,这个元组中只有一个元素,但是我们并没有在第一个元素后面加逗号,通过打印可以看到
这并不符合我们想要创建一个元组的期望,当我们把逗号加上之后运行结果如图
这就成功的创建了一个只含一个元素的元组。
虽然元组的内容不可修改,但是允许我们从元组中提取元素,从元组中提取元素与从列表中提取元素都是使用[]操作符。比如要提取下面这个元组中的数字6
获取元组中某元素的下标,使用的也是方法index,返回第一个匹配项的下标
运行结果为4
统计元组中某元素出现的次数
运行结果为2,说明5这个数字一共在元组x中出现了2次
当然也可以使用len函数来统计元组中一共有多少个元素
运行结果为7,表示元组x中一共有七个元素
注:虽然元组中的元素不可以修改,但是如果元组中的某个元素为列表,是可以对列表中的元素进行修改的。比如
有一个名为x的元组,他的第三个元素是一个列表,现在我们想要把这个列表中的第二个元素改成haha,就可以这样写,运行结果为
总结:元组的特点
1.可以容纳多个数据
2.可以容纳不同类型的数据(混装)
3.数据是有序存储的(下标索引)
4.允许重复数据存在
5.不可以修改(增加或删除元素等,但是允许修改元组内部的列表中的元素)
6.支持for循环与while循环
多数特性和list一致,不同点在于不可修改的特性。
元组的操作方法
字符串(str)
字符串是字符的容器,一个字符串可以存放任意数量的字符。Python中的字符串同样支持下标索引,从前往后下标是从0开始,从后往前下表是从-1开始。比如
就能够拿到下标为2的字符也就是l。字符串和元组一样都是不可修改的容器。
找查特定子串的下标
在字符串中可以找到某个特定子串的位置,语法为字符串.index(子串),比如在字符串hello world中寻找子串world的起始位置,可以这样写
运行结果显示结果为6。
字符串的替换
语法为字符串.replace("字符串1","字符串2"),表示把原字符串中的所有字符串1都替换成字符串2。
前面我们说过字符串是不允许修改的,那么为什么Python中还有替换字符串的功能呢?这是因为使用replace方法得到的字符串是通过返回值的方式给出的,并没有修改原来的字符串,而是得到了一个新的字符串。这一点我们可以通过下面的代码来验证
运行结果为
发现得到的新字符串确实完成了替换,但是原来的字符串my_str内容并没有被改变。
字符串的分割
将原字符串按照指定的分割字符分割成不同的子串并存入一个列表对象中。分割操作并不会影响原字符串本身,而是得到了一个新的列表,里面存放着分割后的字符串。
语法:字符串.split(分割字符)
比如要把字符串192.168.1.1分割,可以这样写
运行结果显示已经把字符串my_str很好的按照'点'这个分隔符分开了
字符串的规整操作
用于去掉原字符串的前后指定的某个字符串
语法:字符串.strip(字符串),特别的,如果是要去掉原字符串前后的空格以及回车符,应该写成字符串.strip(),即括号里面什么也不写,注意不要写成字符串.strip(" ")
举个例子
运行结果为
运行代码
结果为
我们传入的虽然是12这个字符串,但是strip在处理的时候并不是完全的把前后的12给去掉,而是只要是字符1或者字符2都会被去掉。
统计某个子串在原串中出现了多少次
使用的方法仍然是count
运行结果为
统计字符串的长度
使用的函数仍然是len函数,写法为len(字符串),不再赘述
总结:
字符串的特点作为数据容器,字符串有如下特点:
1.只可以存储字符串
2.长度任意(取决于内存大小)
3.支持下标索引
4.允许重复字符串存在
5.不可以修改(增加或删除元素等)
6.支持for循环
基本和列表、元组相同,不同与列表和元组的在于:字符串容器可以容纳的类型是单一的,只能是字符串类型。
字符串的常用操作
序列(一类数据容器的统称)
序列是指内容连续,有序,可以使用下标索引的一类数据容器。列表,元组,字符串均可以视为序列。
序列中有一个常见的操作叫做切片,其实就是从一个序列中取出一个子序列。比如从一个列表[1,2,3,4]中取出一个子列表[1,2]就叫做序列的切片操作。
序列切片操作的语法:序列[起始下标:结束下标:步长],不同的参数之间以冒号隔开。起始下标可以留空,表示从头开始,结束下标也可以留空,表示一直到尾部,步长也可以省略,表示步长为1。留空指的是虽然可以不写,但是要留下这个空,当然冒号也要有,省略就是可以直接不留空,冒号也不用写。
序列的切片操作不会影响序列本身,而是产生了一个新的序列。
下面是一系列的切片操作
结果如图
也可以倒着进行切片操作
运行结果为
表示从后面开始,步长为1进行提取,等同于将序列反转了
倒着进行切片操作也可以指定下标
运行结果为
总结:序列如何做切片
语法:序列[起始:结束:步长]
起始可以省略,省略从头开始
结束可以省略,省略到尾结束
步长可以省略,省略步长为1(可以为负数,表示倒序执行)
练习:利用字符串my_str的内容输出hello
首先通过序列切片的方法提取出了前五个字符,随后对这五个字符按照从后面往前依次提取的方式实现了逆序输出。
法二:先把字符串整体逆序,然后利用切片操作提取出对应下标的字符。
注意提取的时候是前闭后开的,因此结尾下标应该+1
法3:
先利用split按照逗号把my_str分割,并得到一个列表,此时列表的第一个元素是ollehk,使用[0]提取这个元素,拿到了字符串ollehk,然后使用replace将字符k使用空字符替换掉以达到一个删除的效果,再使用[::-1]把replace处理后的字符串逆序。运行结果为hello
集合(set)
像前面学过的列表,元组,字符串他们都是允许元素重复且按照下标排列有序,集合与他们不同的特点是集合不允许有重复元素出现,且排列无序。
集合的定义
集合定义使用的是大括号{}
前面我们说集合的特点有不允许有重复元素出现,所谓的不允许有重复元素存在指的是集合这种类型在输出的时候重复的元素只输出一次,并不是说不允许我们在定义的时候使用两个一样的元素,实际上我们可以理解为集合这种类型具有自动去重的功能。举个例子
运行结果为
再比如
运行结果为
可以观察到结果已经去重了,而且顺序是打乱的。
通过前面两个例子可以证明集合这种类型是去重的,且是无序的,因此对于前面通过下标修改容器内容的方法对于集合就不适用了。但是集合和列表一样是允许修改的,集合的修改有其特有的方式。
在集合中添加新元素
添加新元素使用的是add,语法:集合.add(元素)。将指定元素,添加到集合内
运行结果为
可以观察到hehe这个字符串已经被添加进来了。
移除集合中的元素
语法:集合.remove(元素),将指定元素从集合内移除
运行结果为{'haha'}
注:集合是可以改变的,使用remove本质上是对原来的集合直接进行了修改,而不是返回值。实际上使用remove对集合进行操作并不返回值,如果我们使用变量接收的话接收到的将是None。
从集合中随机取出一个元素
随机取出一个元素使用的是pop,语法:集合.pop(),功能,从集合中随机取出一个元素。
这个pop在前面列表中通过指定下标的方式可以取出对应下标的元素,并且取出的元素将不在集合里面了,相当于是删除了,但是对于集合来讲,没有下标这一说,因此我们在使用pop的时候也不必传参数,此时pop就会自动从集合中取出一个元素。举个例子
运行结果为
发现通过pop取出之后的元素确实是在集合中被删除了。
清空集合
使用的是clear,语法:集合.clear(),功能,清空集合
取两个集合的差集
语法:集合1.difference(集合2),功能:取出集合1和集合2的差集(集合1有而集合2没有的)
结果:得到一个新集合,集合1和集合2不变。
运行下面的代码
结果如下
消除2个集合的差集
语法:集合1.difference_update(集合2)
功能:对比集合1和集合2,在集合1内,删除和集合2相同的元素。
结果:集合1被修改,集合2不变,没有返回值
运行代码
运行结果为
可以发现删除了两个集合中共有的元素也就是1,集合1中的1被删除,集合2不变。
2个集合合并
语法:集合1.union(集合2)
功能:将集合1和集合2组合成新集合
结果:得到新集合,集合1和集合2不变
运行代码
运行结果为
由于集合的自动去重功能,合并后的集合没有重复元素。
统计集合中元素的个数
使用的仍然是len函数,不过集合的特殊之处在于定义时候的元素个数并不等同于实际集合中的元素个数。举个例子
运行结果为3而不是6,这是因为集合是去重的。
集合的遍历
在前面支持下标索引的那些数据容器比如列表,元组,字符串等结构类型中,我们可以使用while循环进行遍历,循环判断的条件是index
运行代码
结果为
总结:
集合的特点:
1.可以容纳多个数据
2.可以容纳不同类型的数据(混装)
3.数据是无序存储的(不支持下标索引)
4.不允许重复数据存在
5.可以修改(增加或删除元素等)
6.支持for循环,但不支持while循环
集合常用操作
练习
创建一个空集合,把数组my_list中的元素依次添加到这个空集合中去
使用for循环遍历整个列表即可,这个练习看起来简单,实际上非常有用,他为我们提供了给列表等数据容器中信息去重的思路。即遍历列表中的所有元素并依次添加到集合中去,由于集合的自动去重功能,使得我们在输出集合的时候已经达到了信息去重的效果。
字典(dict)
在生活中,字典(比如新华字典)可以通过某些字来找到对应的信息,Python中的字典和生活中的字典功能上是非常相似的,Python中的字典是通过key来找的对应的value,比如通过成绩单,通过名字可以找到对应的成绩。
字典的定义
字典的定义与集合一样都是使用使用大括号{},不过字典存储的元素是一个个的键值对,每一个键值对包含Key和Value(用冒号分隔)键值对之间使用逗号分隔,Key和Value可以是任意类型的数据(key不可为字典),Key不可重复,重复会对原有数据覆盖
相比较于定义空集合的方式,定义空字典可以使用{}直接定义一个空字典,这也是为什么不能用{}定义一个空集合,原来是被定义空字典的功能占去了呀。
字典中数据的获取
字典和集合一样,不可以使用下标索引,但是字典可以通过key值来获得对应的value,借助的操作符是[],如图
运行结果为99,也就是对应的张三这个key对应的value值
字典的嵌套
字典中的元素是一个个键值对,其中key可以是除了字典以外的任何类型,而value可以是包含字典在内的任何类型。举个例子,现在要创建一个能够反映不同学生不同学科的字典,可以这样写
如果想要获取到张三的数学成绩,可以使用两个[],写作my_dict["张三"]["math"],首先通过my_dict["张三"]拿到了张三这个key对应的value,这个value是一个字典,然后再次通过math这个key找到它对应的value也就是张三的数学成绩。
字典的操作
新增元素与更新元素
语法:字典[Key] = Value,如果新添加的这个key是原来字典中没有的,就会新增元素。如果新增的这个key是原来存在的,则会更新该元素,因为字典中不允许出现重复的元素。
删除元素
语法:字典.pop(Key),结果:获得指定Key的Value,同时字典被修改,指定Key的数据被删除
清空字典
语法:字典.clear(),结果:字典被修改,元素被清空
获取字典中所有的key
语法:字典.keys(),结果:得到字典中的全部Key
运行代码
结果为
发现keys这种方法得到的结果类型为dict_keys
遍历字典
由于字典不支持下标索引,因此无法使用while循环来遍历字典。
前面已经通过keys的方法拿到了字典的每个key,有了key,就可以通过字典名[key]的方式提取到对应的value了,如果要遍历整个字典,还需要借助for循环
运行代码
运行结果为
my_dict.keys()获取到了该字典的所有key,然后借助for循环,每次使用keys里面的一个key来替换掉前面的临时变量,并执行for循环内部的操作。有一个疑点就是我们说for循环的后面是一个数据集,那么这里的keys是不是数据集呢?通过打印keys的类型发现他其实是dict_keys的类型,表示是字典中一个个key的组合,当然是数据集了。
遍历字典还有另一种写法
这种写法并没有提前获取字典的keys,而是直接从字典中提取元素并替换掉x,虽然我们说字典中的元素应该是一个个键值对,但是语法规定以这样的方式遍历字典的时候遍历的其实是字典的键,也就是说这种写法和上面先用方法keys获取字典“键”的集合,然后遍历的写法是一样的,没有区别。
计算字典内的全部元素(键值对)数量
语法:len(字典)
字典的特点总结
1.可以容纳多个数据
2.可以容纳不同类型的数据
3.每一份数据是KeyValue键值对
4.可以通过Key获取到Value,Key不可重复(重复会覆盖)
5.不支持下标索引
6.可以修改(增加或删除更新元素等)
7.支持for循环,不支持while循环
字典常用操作总结
练习
将下面这个表格以字典的形式呈现出来,如果级别为1则级别提高一级,且工资增加1000元
答案
数据容器总结
数据容器可以从以下视角进行简单的分类:
是否支持下标索引
支持:列表、元组、字符串 - 序列类型
不支持:集合、字典 - 非序列类型
是否支持重复元素:
支持:列表、元组、字符串 - 序列类型
不支持:集合、字典 - 非序列类型
是否可以修改
支持:列表、集合、字典
不支持:元组、字符串
数据容器的通用操作
max(容器),用于查看数据容器中最大的元素
min(容器),用于查看数据容器中最小的元素
len(容器),统计容器中元素的个数
list(容器),把指定容器转换成列表
str(容器),把指定容器转换为字符串
tuple(容器),把指定容器转换成元组
set(容器),把指定容器转换成集合
dict(容器),把指定容器转换成集合,如果传递给 dict() 的是一个其他类型的容器,如列表或集合,那么需要确保这个容器中的元素可以被转换为字典的键值对。
运行结果为
观察到字符串转列表的时候实际上就是把一个个的字符单独拿出来了。
元组转列表的时候实际上就是把小括号换成了中括号。
集合转列表的时候实际上是把大括号变成中括号。
字典转列表的时候抛弃了value值留下了key
可以看到对于字典来讲求最大值或者最小值的时候直接抛弃了,比较的时候实际上返回的最大值或者最小值是一个字符串,也就是说实际上求字典中最大元素的时候是比较的一系列key的大小,这里的my_dict中key是字符串,因此比较的是字符串的大小,如果my_dict中的key是一系列的整数,那求my_dict中最大元素的时候就是看谁的key更大,也就是比较整数的大小。
再来看一组其他类型转集合的代码
运行结果为
可以看到字符串转换成集合的时候顺序被打乱了,这是因为集合是一种无序的数据类型,然后字典转集合的时候同样是抛弃了value,同时如果原本的数据容器中有重复的元素,在转换成集合之后会自动去重。
容器通用排序功能
sorted(容器, [reverse=True]),其中reverse参数可以省略,默认是False,表示按照从大到小的升序排列,如果人为设置参数reverse为True,将会按照从小到大的降序排列。记忆起来也很容易,reverse单词的意思就是反转,把reverse设置成True就是反着输出了。
排序的结果是通过sorted函数的返回值给出的,而不是直接修改原本的容器,这就让sorted的适用范围更广,因为像元组,字符串这样的数据容器是不允许修改的。
运行结果为
再把参数reverse设置成True
运行结果为
容器通用功能一览
Python中字符串的比较
在Python中字符串比较可以直接使用大于号小于号这样的运算符,比较大小的基准还是根据对应字符的ASCII码值大小。两个字符串进行大小比较的时候原理是从头开始一位一位的进行比较,如果两位相同就继续比较下一位,知道比较出两个不同的字符大小。