Python3 CookBook | 数据结构和算法(一)

简介: Python 提供了大量的内置数据结构,包括列表,集合以及字典。在工作和编码中,可以说天天和它们打交道,经常碰到查询,排序和过滤等等这些问题,虽然每次解决这些问题并不困难,但总感觉代码写的很麻烦,不够优雅。

1、解压可迭代对象赋值给多个变量


我们都知道,一个序列是可以赋值给多个变量的,就像下面这样:


In [7]: p = (1, 2, 3)
In [8]: x, y, z = p
In [9]: x
Out[9]: 1
复制代码


但如果接收的变量个数和序列元素个数不一致,就会报错,如果你不知道元素个数的话,可以采用下面这样的方式:


In [10]: x, *y = p
In [11]: y
Out[11]: [2, 3]
复制代码


通过这种星号的方式,就可以解压不确定个数或任意个数的可迭代对象了,是不是很棒呢?

那么,用这个方法可以解决哪些问题呢?

先来看一种情况,现在有一个序列,去掉第一个数和最后一个数,然后求剩下数的平均值。

这个问题很简单,我的第一反应是循环求和,然后计算平均值,显然很麻烦。这时候星号表达式就派上用场了:


def drop_first_last(items):
  first, *middle, last = items
  return avg(middle)
复制代码


再看一种情况,比如字符串的分割:

In [12]: line = 'drwxr-xr-x  41 zyx  staff   1.4K 11 24 08:53 zyx'
In [13]: info, *fields, homedir = line.split(' ')
In [14]: info
Out[14]: 'drwxr-xr-x'
In [15]: homedir
Out[15]: 'zyx'
复制代码


2、保留最后 N 个元素


这个问题也是经常会遇到的,比如只取文件中满足要求的前五行,或者只返回满足要求的最新十条数据。我的第一反应是列表,然后通过 push 和 pop 来操作列表来实现。

其实通过 collections.deque 可以很容易解决这个问题,使用 deque(maxlen=N) 构造函数新建一个固定大小的队列。当新元素加入并且这个队列已满时,最先进入队列的元素便会被移除,符合先进先出的原则。


In [16]: from collections import deque
In [17]: q = deque(maxlen=3)
In [18]: q.append(1)
In [19]: q.append(2)
In [20]: q.append(3)
In [21]: q
Out[21]: deque([1, 2, 3])
In [22]: q.append(4)
In [23]: q
Out[23]: deque([2, 3, 4])
复制代码


如果没有设置 maxlen 则是一个无限大小的队列,可以通过 appendleft 和 pop 在队首和队尾添加删除元素。


3、字典中的键映射多个值


现在有一个需求,构建一个字典,key 是用户 ID,value 为一个列表,列表元素可以是名字,电话等等,大概是这样:

d = {'id': ['name', 'phone']}
复制代码


如果我们自己构建这个字典,可能会像下面这样来实现:

d = {}
for key, value in items:
  if key not in d:
    d[key] = value
  d[key].append(value)
复制代码


很麻烦,如果使用 collections 的 defaultdict 就很简单了。defaultdict 的一个特征就是它会自动初始化每个 key 刚开始对应的值,所以我们只关注添加元素操作就可以了。

优化后代码就变成了这样:


d = defaultdict(list)
for key, value in items:
  d[key].append(value)
复制代码


4、字典排序


字典是无序的,但如果要控制字典中元素的顺序呢?可以使用 colletions 中的 OrderedDict,如下:


d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key in d:
  print(key, d[key])
复制代码


OrderedDict 内部维护这一个根据键插入顺序排序的双向链表。每次新元素插入时,便会被放在链表尾部,对于已经存在的键,并不会改变键的顺序。

但需要注意的是,OrderedDict 的大小是普通字典的两倍,所以在构建一个需要大量 OrderedDict 实例的数据结构时,就要考虑大量内存消耗的影响了。


5、字典的运算


如何取出字典中的最小值,或者对字典进行排序呢?

首先我们来看看直接使用普通的数学运算函数


In [25]: d = {'a': 11, 'b': 43, 'c': 3, 'd': 65}
In [26]: min(d)
Out[26]: 'a'
复制代码


它比较的逻辑是直接比较 key,然后取出对应的 key,但如果要比较 value 呢?

In [28]: min(d.values())
Out[28]: 3
复制代码

结果是正确的,但似乎并不完美,如果键值一起返回就完美了。这时候就该 zip 登场了,它的作用是可以使键和值反转过来。


In [29]: min(zip(d.values(), d.keys()))
Out[29]: (3, 'c')
复制代码


它直接返回了值最小的键和值,这样就很好了,不管需要哪个信息都可以直接使用。如果要对这个字典排序的话也很简单:


In [34]: sorted(zip(d.values(), d.keys()))
Out[34]: [(3, 'c'), (11, 'a'), (43, 'b'), (65, 'd')]
复制代码


先写这么多吧,未完待续。。。


目录
相关文章
|
10月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
11月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
475 26
|
10月前
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
257 5
|
10月前
|
数据采集 Web App开发 数据可视化
Python零基础爬取东方财富网股票行情数据指南
东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
8146 1
|
10月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
760 0
|
10月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
10月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
11月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
11月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南

热门文章

最新文章

推荐镜像

更多