1、列表(list)与元组(tuple)
列表和元组都是可以放置任意数据类型的有序集合
l = [1, 2, 'hello', 'word']
tup = ('jack', 22)
1.1 列表与元组的特点
(1)列表是动态增长的,长度大小不固定,可以随意地增加、删除或者改变元素;
(2)元组是静态的,长度大小固定,无法增加、删除或者改变。
1.1.1 存储方式的差异
(1)列表在存储数据的时候,需要存储指针来指向对应的元素,同时需要额外存储已经分配的长度大小,从而实时追踪列表空间的使用情况,当空间不足时可以及时分配额外空间。这样的机制保证了其操作的高效性,减小了每次增加/删除操作时空间分配的开销,增加/删除的时间复杂度均为O(1);
(2)元组的存储空间是固定的。
1.1.2 列表与元组的性能
(1)从存储方式的区别看出,元组比列表更加轻量级,总体上元组的性能要略优于列表;
(2)python在后台会对静态数据做一些资源缓存(resource caching)。通常来说,因为垃圾回收机制的存在,如果一些变量不被使用了,python就会回收它们所占用的内存,返还给操作系统,以便其他变量或应用使用。但对于一些静态变量,比如元组,如果它不被使用并且占用空间不大时,python会这暂时缓存这部分内存,这样下次再创建同样大小的元组时,就可以直接分配之前缓存的内存空间,这样就能大大加快程序的运行速度;
(3)如果想要增加、删除或改变元素,那么显然列表更优
1.1.3 二者的使用场景
(1)如果存储的数据和变量不变,元组比较适合;
(2)如果存储的数据和变量是可变的,列表更适合。
1.2 操作列表
1.2.1 列表的创建
创建一个空列表
empty_list = list()
# []是一个内置的c函数,可以直接被调用,效率比较高
empty_list = []
1.2.2 访问列表
(1)通过索引或切片来访问列表的元素,索引从0开始
变量名[索引]
(2)返回元素出现的次数
变量名.count(元素值)
(3)返回元素的索引
变量名.index(元素值)
1.2.3 修改、添加和删除元素
(1)修改
变量名[索引] = <元素值>
(2)添加
# 在列表末尾添加元素
变量名.append(元素值)
# 在列表中插入元素,相当于将列表中既有的元素都右移一个位置
变量名.insert(索引,元素值)
(3)删除
# 删除原列表中的元素,不可复用
del 变量名[索引]
# 逻辑列表中的元素,可以赋用,默认删除最后一个元素
变量名.pop(索引)
# 根据值删除元素,只删除列表中第一个出现的值,可以赋用
变量名.remove(元素值)
1.2.4 排序
# 永久性排序,默认从小到大(字母一样),相反顺序需要传递参数reverse=True
变量名.sort()
# 临时排序,不改变原有顺序
变量名.sorted()
# 倒着打印列表
变量.reverse()
1.2.4 遍历列表
# 遍历列表/元组中的每个元素
for 临时变量 in 列表变量:
循环语句
1.2.5 列表解析
列表变量 = [含临时变量的表达式 for 临时变量 in range()]
示例:squares = [value**2 for value in range(1,11)]
输出:[1,4,9,16,25,36,49,64,81,100]
1.3 操作元组
对已有的元组做任何修改,只能重新开辟一块内存,创建新的元组
1.3.1 增加元素
tup = (1, 2, 3, 4)
new_tup = tup + (5, )
new_tup
(1, 2, 3, 4, 5)
1.3.2 访问元组
类似于列表
1.3.3 排序
只有sorted()和reversed()函数
2、字典(dict)和集合(set)
(1)字典是一系列键值对组成的元素的集合,在python3.7+被确认为有序,长度大小可变,元素可以任意地删减和改变,相比于列表和元组性能更优,特别是对于查找、添加和删除操作,都能在常数时间复杂度内完成;
(2)集合和字典基本相同,唯一的区别就是集合没有键值对,是一系列无序的、唯一的元素组合。
(3)字典的内部组成是一张哈希表,可以直接通过键的哈希值找到对应的值,用字典存储数据进行查找时,只需O(1)的时间复杂度即可完成;集合是高度优化的哈希表,里面元素不能重复,其添加和查找操作只需O(1)的复杂度
2.1 字典和集合的创建
无论是键还是值,都可以是混合类型
字典:
d1 = {
}
d1 = {
'name': 'jack', 'age': 20, 'gender':