文章目录
0. 前言
- Python中基本数据结构介绍。
- 参考资料:
- 《深入理解Python特性》第5章
- 《流畅的Python》第2、3章
- 《Python Cookbook》第1章
1. 数组
- 包括list/tuple等。
- 有一些操作是所有序列都共有的。
- 如何选择数组类型:
- 如果需要存储任意对象,且其中可能含有混合数据类型,那应该选择列表或元组。
- 如果存储数值(整数或浮点数)数据,并要求数据排列紧密、注重性能,则应该使用 array.array。
- 强烈建议在初期使用通用数据格式,不要试图在一开始就榨干所有性能。
1.1. 序列
- 个人理解:本质就是数组,可以通过索引来获取(部分类型可以修改)元素。
- 索引操作:
- 数组编号,可以为负数,如-1就是最后一个元素。
- 分片:通过索引来访问一定范围内的元素,形如
[start:end:step]
- 索引范围包括start,不包括end。
- 步长不能是0,但可以是负数。
- 如果start >= end(step为正数)或start <= end(step为负数),则返回空序列。
- 加法:相同类型序列相加就是拼接操作。
- 乘法:生成新序列,原来序列重复x次。
- 成员资格:
in
运算符,判断是否存在某元素。 - 长度、最大/小值,对应
len
max
min
函数。
1.2. 列表
- 基本概念:
list
对象,可变序列。- 底层通过动态数组实现(应该就是类似ArrayList)。
- 不同数据类型可以混合存储在一个列表中,但这回导致数据存储不紧凑,占据了更多的空间。
- 基本操作
- 新建列表:
list = []
- 赋值单个元素:
list[1] = value
- 删除单个元素:
del list[1]
- 分片赋值:
list[:2] = list('ab')
- 新建列表:
- 列表方法
- 基本形式:
对象.方法(参数)
- append
- count
- extend
- index
- insert
- pop
- remove
- reverse
- sort
- 基本形式:
1.3. 元组
- 基本概念:
tuple
,不可变序列,定义时就固定了。- 不同数据类型可以保存在同一个元组中。
- 相比
list
所占的空间更少
- 基本操作
- 定义:
- 直接通过都好分隔:
1, 2, 3
- 通过圆括号括起来:
(1, 2, 3)
- 一个值的元组:
1,
或(1,)
- 直接通过都好分隔:
- tuple函数:将序列转换为元组,
tuple([1, 2, 3])
- 索引、分片获取。
- 定义:
- 元组的优势
- 可以在映射中当作键使用,列表不行。
- 元组作为很多内建函数、方法的返回值。
1.4. array.array
2. 字典
- 即
dict
类。 - 官方文档:Mapping Types Dict
2.1. 字典的基本操作
- 创建字典对象
# 普通方法
map1 = {}
map2 = {1.23:"136", "age":18}
# dict方法
# 可以通过其他映射 或 key-value序列建立字典
key_values = [('name', 'emma'), ('age', 18)]
map3 = dict(key_values)
# 通过关键字创建
map4 = dict(name="emma", age=18)
- 操作操作
len(map) # key-value数量
map[key] # 获取某个key对应的value
map[key] = value # 关联key-value
del map[key] # 删除键为key的项
key in map # 检查map中是否存在键key
- 其他概念
- 键类型:必须为不可变类型(如字符串、整数、实数、元组)
- 自动添加:如果本来不存在的key,可以通过赋值直接创建
- 成员资格:
in
操作查找的是键,不是值。 - 遍历字典:
# 好像建议不这么用
for key in dict:
print(key, dict[key])
# 通过key遍历
for key in dict.keys():
print(key, dict[key])
# 通过key-value对遍历1
# 字典较小时效率较高
for key, value in dict.items():
print(key, value)
# 通过key-value对遍历2
# 字典较大时效率较高
for (key, value) in dict.items():
print(key, value)
- 字典方法
- clear
- copy
- fromkeys
- get
- has_key
- items
- iteritems
- keys
- iterkeys
- pop
- popitem
- setdefault
- update
- values
- itervalues
2.2. 特殊的字典
- 特殊的字典一般都是
dict
的子类,有着几乎相同的使用方式。 collections.OrderdDict
- 作用:记住key的插入顺序,在遍历时会按照循序遍历。
- 在CPython3.6及更高版本中,标准字典实现
dict
也能暴露键的插入顺序,但这只是CPython的一个附带功能,到Python3.7才固定下来。 - 建议使用本功能时还是使用
OrderedDict
collections.defaultdict
- 作用:为缺失的key返回默认值, 构造函数输入的是一个
default_factory
,即一个构造器。 - 构造方法接受一个可调用对象(如
list
),如果查询时key不存在,则返回这个可调用对象。 - 当然,设置默认值这个功能也可以通过
get()
方法实现,但通过这个类可以更清晰地表达意图。 - 实例:
defaultdict(int), defaultdict(list)
int()
返回0。
- 作用:为缺失的key返回默认值, 构造函数输入的是一个
collections.ChainMap
- 作用:将多个字典组成一个映射,查询时逐个查询。
- 查询操作时,会逐个查询,但增删改操作都是对第一个字典进行。
types.MappingProxyType
- 作用:只读字典。
3. 集合
- 参考资料:
- 官方文档:集合类型 - set, frozenset
- 《深入理解Python特性》5.4节
3.1. set
- 最基本的集合类型。
- 集合基本概念:
- 不含重复元素的无序对象。
- 由于是无序的,所以不支持索引、切片操作。
- 每个对象都是 hashable 的对象。
- 预计查询时间复杂度为O(1),交集、并集、子集、差集的时间复杂度为O(n)。
- 新建:
{ele1, ele2, ...}
创建。set(list)
新建- 注意:空集只能通过
set()
而不能用dict
。
- 增删操作
add()
:添加元素。remove()
:删除元素,如果元素不存在会报错。discard()
:删除元素。pop()
:任意移除一个元素,如果是空集会报错。clear()
:清空。
- 基本操作
len(s)
x in s
x not in s
- 集合操作
issubset(other)
或set <= other
或set < other
:s是否是other的子集。isdisjoint(other)
:两个集合没有公共元素则返回True。issuperset(other)
或set >= other
或set > other
:s是否是other的超集。union(*others)
或set | other | ...
:并集。intersection(*others)
或set & other
:交集。~~difference(*others)
或set - other - ...
:差集,存在于set但不存在于other。symmetric_difference(other)
或set ^ other
:只存在于set或other中,不能同时存在或同时不存在。
- 集合改操作,基本上就是一个集合操作加上
update
,是对原始集合的操作update(*others)
或set |= other | ...
:添加来自others的元素。intersection_update(*others
)或set &= other & ...
:只保留在others中也都存在的元素。symmetric_difference_update(other)
:只保留存在于其中一个集合的元素,不能同时存在或同时不存在。
3.2. frozenset
-
不可变集合。
-
与set操作几乎完全相同,就是少了增删改的相关操作。