Python基础(10) 序列(tuple/list)、字典(dict)、集合(set)


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. 字典

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。
  • collections.ChainMap
    • 作用:将多个字典组成一个映射,查询时逐个查询。
    • 查询操作时,会逐个查询,但增删改操作都是对第一个字典进行。
  • types.MappingProxyType
    • 作用:只读字典。

3. 集合

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 <= otherset < other:s是否是other的子集。
    • isdisjoint(other):两个集合没有公共元素则返回True。
    • issuperset(other)set >= otherset > 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操作几乎完全相同,就是少了增删改的相关操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章