![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Python-数据结构和算法
Hereto.
这个作者很懒,什么都没留下…
展开
-
保留最后 N 个元素
保留最后 N 个元素问题解决方案讨论)问题在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录?解决方案保留有限历史记录正是 collections.deque 大显身手的时候。比如,下面的代码 在多行上面做简单的文本匹配,并只返回在前 N 行中匹配成功的行:from collections import dequedef search(lines, pattern...原创 2019-12-18 20:29:30 · 104 阅读 · 0 评论 -
从任意长度的可迭代对象中分解元素
从任意长度的可迭代对象中分解元素问题解决方案讨论问题需要从某个可迭代对象中分解出N个元素,但是这个可迭代对象的长度可能超过N,这将导致出现“分解的值过多(too many values to unoack)”的异常解决方案Python的“ * 表达式 ”可以用来解决这个问题。例如,假设开设了一门课程,并决定在期末的作业中成绩中去掉第一个和最后一个,只对中间剩下的成绩做平均分统计。如果只有4...原创 2019-12-18 09:12:22 · 156 阅读 · 0 评论 -
将序列分解为单独的变量
将序列分解为单独的变量问题解决方案讨论问题我们有一个包含N个元素的元组或序列,现在想将它分解为N个单独的变量解决方案任何序列(可迭代的对象)都可以通过一个简单的赋值操作来分解为单独的变量。唯一的要求时变量的总数和结构要与序列相吻合例如:p = (4, 5)x, y = pprint(x) #4print(y) #5data = ['BAI', 80, 67.3, (2012...原创 2019-12-15 16:34:03 · 129 阅读 · 0 评论 -
查找最大或最小的 N 个元素
当要查找的元素个数相对比较小的时候,函数 nlargest() 和 nsmallest() 是很合适的。如果你仅仅想查找唯一的最小或最大 (N=1) 的元素的话,那么使用 min() 和max() 函数会更快些。类似的,如果 N 的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点 ( sorted(items)[:N] 或者是 sorted(items)[-N:] )。需要在正确场合使用函数 nlargest() 和 nsmallest() 才能发挥它们的优势 (如果N 快接原创 2020-01-07 15:06:17 · 321 阅读 · 0 评论 -
实现一个优先级队列
目录问题解决方案讨论问题怎样实现一个按优先级排序的队列?并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素解决方案下面的类利用 heapq 模块实现了一个简单的优先级队列:import heapqclass PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def pu...原创 2020-01-07 15:11:26 · 878 阅读 · 0 评论 -
字典中的键映射多个值
目录问题解决方案讨论问题怎样实现一个键对应多个值的字典 (也叫 multidict )?解决方案一个字典就是一个键对应一个单值的映射。如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中,比如列表或者集合里面。比如,你可以像下面这样构造这样的字典:d = { 'a' : [1, 2, 3], 'b' : [4, 5]}e = { 'a' : {1, 2, 3}...原创 2020-01-07 15:17:50 · 448 阅读 · 0 评论 -
字典排序
目录问题解决方案讨论问题你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。解决方案为 了 能 控 制 一 个 字 典 中 元 素 的 顺 序, 你 可 以 使 用 collections 模 块 中 的OrderedDict 类。在迭代操作的时候它会保持元素被插入时的顺序,示例如下:from collections import OrderedDictdef o...原创 2020-01-07 15:20:42 · 117 阅读 · 0 评论 -
字典的运算
目录问题解决方案讨论问题怎样在数据字典中执行一些计算操作 (比如求最小值、最大值、排序等等)?解决方案考虑下面的股票名和价格映射字典:prices = {'ACME': 45.23,'AAPL': 612.78,'IBM': 205.55,'HPQ': 37.20,'FB': 10.75}为了对字典值执行计算操作,通常需要使用 zip() 函数先将键和值反转过来。比如,...原创 2020-01-07 15:24:13 · 519 阅读 · 0 评论 -
查找两字典的相同点
目录问题解决方案讨论问题怎样在两个字典中寻寻找相同点 (比如相同的键、相同的值等等)?解决方案考虑下面两个字典:a = { 'x' : 1, 'y' : 2, 'z' : 3}b = { 'w' : 10, 'x' : 11, 'y' : 2}为了寻找两个字典的相同点,可以简单的在两字典的 keys() 或者 items() 方法返回结果上执行集合操作。比如:#...原创 2020-01-07 15:26:00 · 156 阅读 · 0 评论 -
删除序列相同元素并保持顺序
目录问题解决方案讨论问题怎样在一个序列上面保持元素顺序的同时消除重复的值?解决方案如果序列上的值都是 hashable 类型,那么可以很简单的利用集合或者生成器来解决这个问题。比如:def dedupe(items): seen = set() for item in items: if item not in seen: yield item seen.add(i...原创 2020-01-07 15:29:33 · 461 阅读 · 0 评论 -
命名切片
目录问题解决方案讨论问题你的程序已经出现一大堆已无法直视的硬编码切片下标,然后你想清理下代码。解决方案假定你有一段代码要从一个记录字符串中几个固定位置提取出特定的数据字段 (比如文件或类似格式):###### 0123456789012345678901234567890123456789012345678901234567890'record = '...................原创 2020-01-07 15:32:17 · 121 阅读 · 0 评论 -
序列中出现次数最多的元素
目录问题解决方案讨论问题怎样找出一个序列中出现次数最多的元素呢?解决方案collections.Counter 类就是专门为这类问题而设计的,它甚至有一个有用的most common() 方法直接给了你答案。为了演示,先假设你有一个单词列表并且想找出哪个单词出现频率最高。你可以这样做:words = [ 'look', 'into', 'my', 'eyes', 'look', ...原创 2020-01-07 15:34:46 · 616 阅读 · 0 评论 -
通过某个关键字排序一个字典列表
目录问题解决方案讨论问题你有一个字典列表,你想根据某个或某几个字典字段来排序这个列表。解决方案通过使用 operator 模块的 itemgetter 函数,可以非常容易的排序这样的数据结构。假设你从数据库中检索出来网站会员信息列表,并且以下列的数据结构返回:rows = [ {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'...原创 2020-01-07 15:37:26 · 227 阅读 · 0 评论 -
排序不支持原生比较的对象
目录问题解决方案讨论问题你想排序类型相同的对象,但是他们不支持原生的比较操作。解决方案内置的 sorted() 函数有一个关键字参数 key ,可以传入一个 callable 对象给它,这个 callable 对象对每个传入的对象返回一个值,这个值会被 sorted 用来排序这些对象。比如,如果你在应用程序里面有一个 User 实例序列,并且你希望通过他们的user id 属性进行排...原创 2020-01-07 15:39:21 · 73 阅读 · 0 评论 -
通过某个字段将记录分组
目录问题解决方案讨论问题你有一个字典或者实例的序列,然后你想根据某个特定的字段比如 date 来分组迭代访问。解决方案itertools.groupby() 函数对于这样的数据分组操作非常实用。为了演示,假设你已经有了下列的字典列表:rows = [ {'address': '5412 N CLARK', 'date': '07/01/2012'}, {'address': '51...原创 2020-01-07 15:42:29 · 228 阅读 · 0 评论 -
过滤序列元素
目录问题解决方案讨论问题你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列解决方案最简单的过滤序列元素的方法就是使用列表推导。比如:>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]>>> [n for n in mylist if n > 0][1, 4, 10, 2, 3]>>&...原创 2020-01-07 15:45:54 · 151 阅读 · 0 评论 -
从字典中提取子集
目录问题解决方案讨论问题你想构造一个字典,它是另外一个字典的子集。解决方案最简单的方式是使用字典推导。比如:prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75}# Make a dictionary of all prices over 200p1 = {ke...原创 2020-01-07 15:48:49 · 199 阅读 · 0 评论 -
映射名称到序列元素
目录问题解决方案讨论问题你有一段通过下标访问列表或者元组中元素的代码,但是这样有时候会使得你的代码难以阅读,于是你想通过名称来访问元素。解决方案collections.namedtuple() 函数通过使用一个普通的元组对象来帮你解决这个问题。这个函数实际上是一个返回 Python 中标准元组类型子类的一个工厂方法。你需要传递一个类型名和你需要的字段给它,然后它就会返回一个类,你可以初...原创 2020-01-07 15:52:34 · 97 阅读 · 0 评论 -
转换并同时计算数据
目录问题解决方案讨论问题你需要在数据序列上执行聚集函数 (比如 sum() , min() , max() ),但是首先你需要先转换或者过滤数据解决方案一个非常优雅的方式去结合数据计算与转换就是使用一个生成器表达式参数。比如,如果你想计算平方和,可以像下面这样做:nums = [1, 2, 3, 4, 5]s = sum(x * x for x in nums)下面是更多的例子:...原创 2020-01-07 16:00:38 · 109 阅读 · 0 评论 -
合并多个字典或映射
目录问题解决方案讨论问题现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在。解决方案假如你有如下两个字典:a = {'x': 1, 'z': 3 }b = {'y': 2, 'z': 4 }现在假设你必须在两个字典中执行查找操作 (比如先从 a 中找,如果找不到再在 b中找)。一个非常简单扼解决方案就是使用 collec...原创 2020-01-07 16:09:15 · 165 阅读 · 0 评论