Python 使用键值分组或者分区数据,对分组后的数据做何种归约是没有限制的。数据中可能包含一些自变量或者因变量。可以通过自变量对数据进行分区,然后计算每个分区的各项汇总值,包括最大值、最小值、平均值以及标准差等。

对数据做复杂归约的关键是保存每组中的所有数据。Counter函数仅收集相同数据出现的频次,我们需要基于键值将原始数据转换为序列。

简而言之,每个5海里的箱子中都保存了该范围内路径段的所有数据,而不仅仅是出现次数。不妨将分区看作递归,或者defaultdict(list)对象的有状态应用,下面介绍groupby()函数的递归定义,它相对简单一些。

显然,groupby(C, key)函数对空集合C的返回值是空字典dict(),或者一般而言,空defaultdict(list)对象。

对于非空集合,首先处理集合头部C[0],然后递归处理集合尾部C[1:]。可以使用head, *tail = C来提取集合的头部和尾部,如下所示:

下面用dict[key(head)].append(head)将头部元素放入结果字典中,然后用groupby (tail, key)方法处理剩余数据。

如下所示创建函数:

内部函数group_into()实现了核心的递归定义部分,当集合collection为空时返回输入的字典参数。非空集合则分成头部和尾部,头部用于更新字典,尾部包含所有剩余元素,以递归方式更新字典。

类型标示区分了数据源类型S_和键类型K_。作为key参数的函数必须接收S_类型的参数,返回K_类型的值。前面很多例子都包含了从Leg对象中取出距离的函数。套用Callable[[S_], K_],数据源类型S_是Leg,键类型K_是float。

这里不能用Python的默认参数将上面的函数简化为简单函数,例如下面的实现方法不可取:

这样写的话,对group_by()函数的所有调用都将使用同一个defaultdict(list)对象。Python只创建一次默认值,用可变对象做默认值,其行为往往不符合开发者的预期。这里选用嵌套函数作为实现方案,而没有使用不可变的默认参数(例如None)结合复杂的逻辑判断来实现。用外层包装函数初始化内嵌函数的参数。

下面对距离数据进行分组:

首先定义了一个简单且可复用的匿名函数,将距离数据按照5海里进行分箱,然后利用该匿名函数对数据进行分组。

检查分箱后的数据,如下所示:

输出结果如下:

或者用迭代方法实现partition()函数,如下所示:

进行尾调用优化时,命令式实现的核心部分与递归定义是一致的。前面已经分析了这行代码,保证改写后的输出与之前一样。其余部分作为解决Python递归限制的常规编程实践,与之前的尾调用优化实现是一致的。

类型标示区分了数据源类型S_和键类型K_。请注意,defaultdict(list)的返回值要用Dict[K_, List[S_]]标示协助mypy工具确认代码正常运行,否则会返回错误信息:error: Need type annotation for variable。defaultdict可以包含任何类型组合,如果没有类型标示,将无法确认是否使用了正确的类型。

也可以把这里的类型标示写成注释的形式,如下所示:

低版本的pylint工具要求必须这样写,因此推荐使用1.8及之后的版本。

python输出键值列表_Python 键值分组或分区数据相关推荐

  1. python如何创建一个列表_python怎样快速构建列表?

    来自"专业人士笔记":创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com Python列表是Python程序中广泛使用的一种 ...

  2. python中对列表排序_在Python中对嵌套列表进行排序和分组

    在Python中对嵌套列表进行排序和分组 我具有以下数据结构(列表列表) [ ['4', '21', '1', '14', '2008-10-24 15:42:58'], ['3', '22', '4 ...

  3. python函数没有修改列表_Python:通过引用创建一个修改列表的函数不是值

    Python以相同的方式传递所有内容,但是通过"通过值"或"通过引用"来调用它不会清除所有内容,因为Python的语义与通常应用的语言不同.如果我要描述它,我会 ...

  4. python输出结果空格分割_python 输出列表元素实例(以空格/逗号为分隔符)

    给定list,如何以空格/逗号等符号以分隔符输出呢? 一般的,简单的for循环可以打印出list的内容: l=[1,2,3,4] for i in l: print(i) 输出结果一行一个元素: 1 ...

  5. python怎么创建字符串列表_Python(字符串,列表,元组,字典)

    1.字符串:标识" " PS:字符串是%s:整数是%d:浮点数%f strip:移除(空白或者特定字符) split:分割 len:长度(获取元素的个数) 索引 切片 2.列表li ...

  6. python生成随机整数列表_python生成随机整数

    原博文 2019-10-08 11:09 − python生成随机不重复的整数,用random中的sample index = random.sample(range(0,10),10) 上面是生成不 ...

  7. python如何返回一个列表_python如何返回元组,列表或字典的?

    Python中的数据结构用于存储数据集合,这些数据可以从函数中返回.那么python如何返回元组,列表或字典的?在本文中,我们将探讨如何从这些数据结构中返回多个值:元组,列表和字典.您可以从Pytho ...

  8. python元组读取到列表_Python 学习笔记(1)Python容器:列表、元组、字典与集合...

    Python容器:列表.元组.字典与集合 列表: 1.列表 的创建 使用[ ] 或者list()创建列表:empty_list = [ ] 或者 empty_list= list() 使用list() ...

  9. python遍历多层嵌套列表_python遍历多层嵌套列表

    python 多层嵌套的json内容 怎么获取 如下,已经实现获取json中的指定内容,先在的问题是:有的json目标内容可以首先使用json包的loads函数对json数据进行解析,然后就可以像操作 ...

最新文章

  1. 基于OS信号实现Java异步通知
  2. python数据库模块_十二、Python高级功能之Mysql数据库模块
  3. 【效率】NB,真PDF神处理工具!
  4. RabbitMQ 入门:1. Message Broker(消息代理)
  5. 学会这两招,快速突出图表重点,让老板眼前一亮
  6. Create React App 2.0 华丽登场
  7. 骨牌铺方格(HDU-2046)
  8. 苹果cmsV10仿哈哩哈哩动漫自适应模板
  9. C++ STL之vector详解
  10. github html5 预览,github 上如何直接预览仓库中的html
  11. ubuntu 卡死 安装 桌面_Ubuntu下图形界面卡死解决办法
  12. 如何计算代码运行的时间?
  13. python表示倍数的英语句型_5种倍数表达法句型
  14. 浙江省等保测评机构项目测评收费价格标准参考
  15. 《刷新:重新发现商业与未来》读后感
  16. 《Linux命令行与shell脚本大全》笔记
  17. GNU 和 UNIX 命令
  18. win7防火墙在哪里设置【系统天地】
  19. 移动端页面键盘弹出后导致body高度变低背景图片被挤上去解决方法
  20. 0ra-12170 tns 连接超时

热门文章

  1. CVPR 2019开源论文 | Rob-GAN:生成器、鉴别器以及对抗攻击者
  2. ACL 2018论文解读 | 基于路径的实体图关系抽取模型
  3. 本期最新 9 篇论文,帮你完美解决「读什么」的问题 | PaperDaily #19
  4. 云计算(Cloud Computing)的前世今生
  5. json文件读取并转换成为字典python
  6. waitpid最后以一个参数设为0_西门子MM440变频器参数设置
  7. 【MyBatis使用】mapper.xml 中特殊符号的 2 种处理方法(CDATA区+替代字符举例)
  8. Web前端中级认证php,1+x 证书 Web 前端开发中级理论考试 (试卷 6 )
  9. 联发科mtk和骁龙730哪个好_天玑720和骁龙730g哪个好?两款处理器应该如何选择?...
  10. shiro之第一个程序认证