1. 列表(list)
1.1 基本用法
- 列表是Python中的一个对象;列表是用来存储对象的对象;
- 对象(object)就是内存中专门用来存储数据的一块区域;
- 列表中可以保存多个有序的数据;列表中的对象都会按照插入的顺序存储到列表中;
- 通过索引(index)来获取列表中的元素;索引是从0开始的整数,列表第一个位置索引为0;
- 语法:
my_list[索引];如果使用的索引超出最大范围,会抛出异常;
- 可以通过len()函数获取列表的长度;获取到的长度的值,是列表的最大索引 + 1;
1.2 切片(slice)
- 切片指从现有列表中,获取一个子列表;
- 列表的索引可以是负数;如果索引是负数,则从后向前获取元素,
-1表示倒数第一个,-2表示倒数第二个,以此类推; - 基本语法:
列表[起始:结束]; - 通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素,即前闭后开区间;
- 做切片操作时,总会返回一个新的列表,但不会影响原来的列表;
- 起始和结束位置的索引都可以省略不写;如果省略结束位置,则会一直截取到最后;如果省略起始位置,则会从第一个元素开始截取;如果起始位置和结束位置全部省略,则相当于创建了一个列表的副本;
- 带步长的切片语法:
列表[起始:结束:步长]; - 步长表示每次获取元素的间隔,默认值是1;
- 如果步长是负数,则会从列表的后部向前边取元素;
- 例如:
print(stus[::-1])会将返回列表的倒序排列;
1.3 通用操作
+将两个列表拼接为一个列表;例如:my_list = [1,2,3] + [4,5,6];*将列表重复指定的次数;例如:my_list = [1,2,3] * 5;in用来检查指定元素是否存在于列表中;如果存在,返回True,否则返回False;not in用来检查指定元素是否不在列表中;如果不在,返回True,否则返回False;len()获取列表中的元素的个数;min()获取列表中的最小值;max()获取列表中的最大值;- 方法(method):方法和函数基本上是一样,只不过方法必须通过
对象.方法()的形式调用; s.count()统计指定元素在列表中出现的次数;列表.index(元素)获取指定元素在列表中的第一次出现时索引;index(元素,i,j)中的第二个参数(可选),i表示查找的起始位置 , 第三个参数(可选)j,表示查找的结束位置;如果要获取列表中没有的元素,会抛出异常,ValueError: 'xxx' is not in list,看一个例子就很好理解了:
通用操作,👉官方文档:
1.4 序列(sequence)
- 序列是Python中最基本的一种数据结构;
- 数据结构指计算机中数据存储的方式;
- 序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引);并且序列中的数据会按照添加的顺序来分配索引;
- 序列的分类:可变序列(序列中的元素可以改变):> 列表(list);不可变序列(序列中的元素不能改变):> 字符串(str) > 元组(tuple)。
1.5 修改元素
修改列表中的元素,直接通过索引来修改元素;例如:
sixology_info[12] = '孙悟空扛着金箍棒正在赶来的路上';通过del来删除元素,例如:
del sixology_info[4],就把列表中索引为4的元素删除了,刚才的语句把国际巨星删除了;同样可以使用带步长的删除元素操作:del sixology_info[::2],该语句将隔一个删除一个元素,为了保证六学的信息完整,因此我并没有运行该语句;通过切片来修改列表;在给切片进行赋值时,只能使用序列;
当设置了步长时,序列中元素的个数必须和切片中元素的个数一致;
可以通过
list()函数将其他的序列转换为list;例如:six_young_boy_other_film = ‘《吴承恩与西游记》’,–>six_young_boy_other_film = list(six_young_boy_other_film)可实现字符串到列表的转换;
1.6 列表(list)的方法
👉官方文档:
.append()向列表的最后添加一个元素;.insert(位置,元素)向列表的指定位置插入一个元素;注意使用索引插入与该函数插入的区别:使用索引插入相当于改变索引位置的元素,而insert()函数,是插入一个元素,原来索引位置的元素后移,即索引+1;.extend()使用新的序列来扩展当前序列,需要一个序列作为参数,它会将该序列中的元素添加到当前列表中;相当于+=运算;.clear()清空序列;.pop(索引)根据索引删除,并且会返回被删除的元素;如果索引不写,默认删除最后一个;.remove(值)删除指定值的元素,如果相同值的元素有多个,默认只会删除第一个;.reverse()用来反转列表;.sort()用来对列表中的元素进行排序,默认是升序排列; 如果需要降序排列,则需要传递一个reverse=True作为参数;
1.7 range
range()是一个函数,可以用来生成一个自然数的序列;- 该函数需要三个参数:>1.起始位置(可以省略,默认是0);>2.结束位置;>3.步长(可以省略,默认是1);
- 通过range()可以创建一个执行指定次数的for循环,for()循环除了创建方式以外,其余的都和while一样,包括else、包括break continue都可以在for循环中使用,并且for循环使用也更加简单。
2. 元组(tuple)
2.1 元组
- 元组是一个不可变的序列,它的操作的方式基本上和列表是一致的;
- 一般当我们希望数据不改变时,就使用元组,其余情况都使用列表;
- 使用
()来创建元组;例如my_tuple = ()创建了一个空元组; - 元组是不可变对象,不能尝试为元组中的元素重新赋值;
- 例如:
my_tuple[6] = '孙悟空'出错:TypeError: 'tuple' object does not support item assignment; - 当元组不是空元组时,括号可以省略;如果元组不是空元组,它里边至少要有一个,
my_tuple = 10,20 - 元组的解包(解构):解包指就是将元组当中每一个元素都赋值给一个变量;
- 交换a 和
b的值,这时我们就可以利用元组的解包:
a , b = b , a; - 在对一个元组进行解包时,变量的数量必须和元组中的元素的数量一致;也可以在变量前边添加一个
*,这样变量将会获取元组中所有剩余的元素;a , b , *c = my_tuple; - 不能同时出现两个或以上的
*变量,例如:*a , *b , c = my_tuple报错:SyntaxError: two starred expressions in assignment;
2.2 可变对象
- 每个对象中都保存了三个数据: 1)id(标识); 2)type(类型); 3)value(值) ;
可变对象指的是值可变。
- 列表就是一个可变对象
a = [1,2,3]
a[0] = 10(改对象);- 该操作是在通过变量去修改对象的值;
- 这种操作不会改变变量所指向的对象;
- 当我们去修改对象时,如果有其他变量也指向了该对象,则修改也会在其他的变量中体现;
a = [4,5,6] (改变量) - 该操作是在给变量重新赋值;
- 这种操作会改变变量所指向的对象;
- 为一个变量重新赋值时,不会影响其他的变量;
- 一般只有在为变量赋值时才是修改变量,其余的都是修改对象;
2.3 is 和 ==
==!=比较的是对象的值是否相等 ;isis not比较的是对象的id是否相等(比较两个对象是否是同一个对象);
a = [1,2,3]
b = [1,2,3]
print(a,b)
print(id(a),id(b))
print(a == b) # a和b的值相等,使用==会返回True
print(a is b) # a和b不是同一个对象,内存地址不同,使用is会返回False3. 字典(dict)
- 字典属于一种新的数据结构,称为映射(mapping);
- 字典的作用和列表类似,都是用来存储对象的容器;
- 列表存储数据的性能很好,查询元素效率非常快,但是查询数据的性能的很差;
- 字典中可以保存多个对象,每个对象都会有一个唯一的名字,称其为键(key),通过key可以快速的查询值(value);即键值对(key-value)结构;每个字典中都可以有多个键值对,而每一个键值对我们称其为一项(item);
3.1 基本用法
- 使用
{}来创建字典,d = {}创建了一个空字典; - 字典的值可以是任意对象,字典的键可以是任意的不可变对象(int、str、bool、tuple …),但是一般我们都会使用str;
- 字典的键是不能重复的,如果出现重复的后边的会替换到前边的;
- 需要根据键来获取值;
print(d['name'],d['age'],d['gender']); - 如果使用了字典中不存在的键,会报错:
print(d['hello']) KeyError: 'hello';
- 也可以将一个包含有双值子序列的序列转换为字典;
- 双值序列,序列中只有两个值,
[1,2] ('a',3) 'ab'; - 子序列,如果序列中的元素也是序列,那么我们就称这个元素为子序列;
d = dict([('name','孙悟空'),('age',18)]);
3.2 字典的使用
len(字典)获取字典中键值对的个数;in检查字典中是否包含指定的键;not in检查字典中是否不包含指定的键;- 获取字典中的值,根据键来获取值;语法:
d[key];通过[ ]来获取值时,如果键不存在,会抛出异常KeyError; .get(key[, default])方法用来根据键来获取字典中的值;如果获取的键在字典中不存在,会返回None;也可以指定一个默认值,来作为第二个参数,这样获取不到值时将会返回默认值;print(d.get('name'));- 修改字典:
d[key] = value如果key存在则覆盖,不存在则添加; setdefault(key[, default])可以用来向字典中添加key-value;如果key已经存在于字典中,则返回key的值,不会对字典做任何操作;如果key不存在,则向字典中添加这个key,并设置value;.update([other]);将其他的字典中的key-value添加到当前字典中;如果有重复的key,则后边的会替换到当前的;- 删除,可以使用 del 来删除字典中的 key-value;
.popitem()随机删除字典中的一个键值对,一般都会删除最后一个键值对;删除之后,它会将删除的key-value作为返回值返回;返回的是一个元组,元组中有两个元素,第一个元素是删除的key,第二个是删除的value;当使用.popitem()删除一个空字典时,会抛出异常KeyError: 'popitem(): dictionary is empty';.clear()方法用来清空字典;.copy()方法用于对字典进行浅复制;复制以后的对象,和原对象是独立,修改一个不会影响另一个;注意,浅复制会简单复制对象内部的值,如果值也是一个可变对象,这个可变对象不会被复制;
3.3 遍历字典
.keys()方法会返回字典的所有的key;该方法会返回一个序列,序列中保存有字典的所有的键;- 通过遍历
.keys()来获取所有的键:
for k in d.keys() :
print(k , d[k]).values()方法会返回一个序列,序列中保存有字典的左右的值;
for v in d.values():
print(v).items()方法会返回字典中所有的项,它会返回一个序列,序列中包含有双值子序列;双值分别是,字典中的key和value;
4.集合(set)
- 集合和列表非常相似
- 不同点: 1.集合中只能存储不可变对象; 2.集合中存储的对象是无序(不是按照元素的插入顺序保存); 3.集合中不能出现重复的元素;
4.1 基本使用
- 使用
{}来创建集合;
s = {10,3,5,1,2,1,2,3,1,1,1,1} # <class 'set'>
# s = {[1,2,3],[4,6,7]} TypeError: unhashable type: 'list'- 使用
set()函数来创建集合;s = set()创建了一个空集合; - 可以通过
set()来将序列和字典转换为集合:
s = set([1,2,3,4,5,1,1,2,3,4,5])
s = set('hello')
s = set({'a':1,'b':2,'c':3}) # 使用set()将字典转换为集合时,只会包含字典中的键- 使用
in和not in来检查集合中的元素; - 使用
len()获取集合中元素的数量; .update()方法将一个集合中的元素添加到当前集合中;.update()可以传递序列或字典作为参数,字典只会使用键;.pop()方法随机删除并返回一个集合中的元素;.remove()方法删除集合中的指定元素;.clear()方法清空集合;.copy()方法对集合进行浅复制;
4.2 集合的运算
- 在对集合做运算时,不会影响原来的集合,而是返回一个运算结果;
# 创建两个集合
s = {1,2,3,4,5}
s2 = {3,4,5,6,7}
# & 交集运算
result = s & s2 # {3, 4, 5}
# | 并集运算
result = s | s2 # {1,2,3,4,5,6,7}
# - 差集
result = s - s2 # {1, 2}
# ^ 异或集 获取只在一个集合中出现的元素
result = s ^ s2 # {1, 2, 6, 7}
# <= 检查一个集合是否是另一个集合的子集
# 如果a集合中的元素全部都在b集合中出现,那么a集合就是b集合的子集,b集合是a集合超集
a = {1,2,3}
b = {1,2,3,4,5}
result = a <= b # True
result = {1,2,3} <= {1,2,3} # True
result = {1,2,3,4,5} <= {1,2,3} # False
# < 检查一个集合是否是另一个集合的真子集
# 如果超集b中含有子集a中所有元素,并且b中还有a中没有的元素,则b就是a的真超集,a是b的真子集
result = {1,2,3} < {1,2,3} # False
result = {1,2,3} < {1,2,3,4,5} # True
# >= 检查一个集合是否是另一个的超集
# > 检查一个集合是否是另一个的真超集
print('result =',result)