Python List/Dict 学习

记录于 10.4.
图片部分建议参考该页面:Python 学习日记 - 10.4

List 的 Slice 操作

  • 跟字符串部分差不多
  • [start: end: step]
  • 可以是用负数进行检索

List 的 排序

  • 原地排序
  • .sort(reverse = True) 括号内代表降序
  • 打乱顺序
  • random.shuffle(List)
  • 生成新的列表并排序
  • newList = sorted(List)
  • List 逆序返回迭代器对象,不对原数组做操作
  • reverseObj = reversed(List)
  • newList = List(reverseObj)

不可变序列 - 元组

  • 排序只能使用内置的 sorted 生成新的元组
  • 将多个 List 连接成为 zip对象,list()处理后,每个元素均为元组对象
  • newTuple = zip(ListA, ListB, ListC)
  • newList = list(newTuple)

生成器推导式创建元组

  • 生成器推导式生成的不是列表也不是元组,而是一个生成器对象
  • 语法格式举例: (x for x in range(5))
  • 可以使用 .next() 方法对生成器对象进行单个访问

字典的创建

  • 最简单的为 dictA = {key1: value1, key2: value2}
  • dictB = dict(key1 = value1, key2 = value2)
  • dictC = dict( [(key1, value1), (key2, value2)] )
  • dictD = dict(zip(keyListA, valueListB))
  • 可以用 None 创建空值

字典元素的访问

  • dict[key]
  • .get(key, '异常提示') 不存在则抛出异常 None
  • .items() 获得所有键值对
  • .keys() / .values()

序列解包

  • x, y, z = List[1:4]
  • a, b, c = dictA # 获得的是键
  • 加上 .values() / .items() 可以获得相应的值

字典实现底层原理

  • 字典通过键去查找元素
  • 本质上是散列表,也就是稀疏数组(总是含有空白元素),数组的每个单元叫做bucket,每个bucket有两部分,一个是见对象的引用,一个是值对象的引用
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1e05c104-930b-4311-b186-b4c5024f26fa/Untitled.png
  • 下面的存储内容只是示例,真实存储的为键对象的地址以及值对象的地址
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c031e7f6-7de6-4249-adfd-2f5dc6f1383d/Untitled.png
  • 如果存取都是这样的方式,那么效率不仅低的可怕,甚至有些数据都查找不到,以及空间占用太恐怖了吧
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/465f9a69-738e-4b55-8659-588ef8d59595/Untitled.png
  • 最好不要同时遍历字典以及执行删除操作,否则可能导致扩容,次序发生变化

集合

  • 无序可变,元素不能重复
  • 本质是字典,只有键对象
  • 使用 {} 创建对象,使用 .add() 添加元素
  • 使用 set() ,将列表、元组等可迭代对象转成集合,如果存在重复项,则只保留一个
  • .remove() 删除指定元素
  • .clear() 清除所有元素
  • 集合的相关运算
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4360c6e0-7728-4974-bb14-57fc5d7fc7bd/Untitled.png

循环

  • 可以增加 else:
  • 如果正常执行完所有循环,则不执行 else:
  • 循环代码优化:首先尽量减少循环内部不必要的计算;嵌套循环中,尽量减少内层循环的计算,往外提;尽量使用局部变量查询;连接字符串尽量使用 ''.join(List);列表进行插入和删除,尽量在列表尾部操作;

使用 zip() 并行迭代

  • 就是多重同时访问,用完即停
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f279fa10-e794-4a7d-af35-9d6610287dd8/Untitled.png

推导式

  • 列表推导式:
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4728abcc-0703-4f44-af5a-c0ba08606f73/Untitled.png
  • 字典推导式,也可以添加 if 语句
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/938414f2-af18-48db-9582-ec10366d083d/Untitled.png
  • 集合推导式:
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4c7a1b1f-72d5-4337-9971-31e02ceca0d0/Untitled.png
  • 生成器推导式(返回的是生成器)
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6a9d2a98-4d22-4ac8-8414-4c87e7c6ab5b/Untitled.png
  • 可迭代对象:也即可以被循环访问
赞赏