关于itertools.groupby()

itertools.groupby()就是将相邻的并且相同的键值划分为同一组,相似功能可以看https://docs.python.org/3/library/itertools.html?highlight=groupby#itertools.groupby写的groupby类

>>> list_a
['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'D', 'A', 'A', 'B', 'B', 'B']
>>> for date, items in groupby(list_a):
... print('date: {}'.format(date))
... for item in items:
... print(item, end=" ")
... print("\n==========")
...
date: A
A A A A
==========
date: B
B B B
==========
date: C
C C
==========
date: D
D
==========
date: A
A A
==========
date: B
B B B
==========

是不是发现上述例子还有可简化之处,毕竟A的分组要都归为一组(这是因为存在不相邻的A才出现的情况):

>>> list_a
['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'D', 'A', 'A', 'B', 'B', 'B']
>>> list_a.sort(key=lambda list: list) # 经过lambda匿名函数排序后,将相邻的元素放在一起
>>> list_a
['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'D']
>>> for date, items in groupby(list_a):
... print('date: {}'.format(date))
... for item in items:
... print(item, end=" ")
... print("\n==========")
...
date: A
A A A A A A
==========
date: B
B B B B B B
==========
date: C
C C
==========
date: D
D
==========

除了使用lambda匿名函数之外,还可以使用operator.itemgetter()函数,效率比lambda更快一些,具体可以看《Python Cookbook》

关于itertools.compress(data, selectors)

根据传递进去的选择器进行判断是否保留数据

>>> list1 = [1, 4, 7, 2, 98, 3, 6, 2]
>>> list_TF = [0,1,0,1,1,1,0,0]
>>> list_TF = [n ==1 for n in list_TF]
>>> list_TF
[False, True, False, True, True, True, False, False]
>>> from itertools import compress
>>> list(compress(list1, list_TF))
[4, 2, 98, 3]

其实通过教程我们还可以发现compress是大致如下:

>>> list1
[1, 4, 7, 2, 98, 3, 6, 2]
>>> list_TF
[False, True, False, True, True, True, False, False]
>>> [n for n,s in zip(list1, list_TF) if s]
[4, 2, 98, 3]

如果觉得慢,还可以使用生成器来代替

itertools.groupby()/itertools.compress() 笔记的更多相关文章

  1. [PY3]——根据某个特定的字段来分组迭代访问一个字段或序列?/ itertools.groupby( )函数

    问题 你有一个字典或者实例的序列,然后你想根据某个特定的字段(比如‘date’)来分组迭代访问. 解决方案 itertools.groupby( )函数 itertools.groupby(rows, ...

  2. itertools.groupby()分组字典列表

    ## itertools.groupby()分组字典列表数据 from operator import itemgetter from itertools import groupby student ...

  3. Python中itertools.groupby分组的使用

    Python中itertools.groupby分组的使用 有时候我们需要给一个列表按照某个属性分组,可以借助groupby来实现. 比如:一下列表我想以严重程度给它分组,并求出每组的元素个数. fr ...

  4. Python中的字典分组函数(groupby,itertools)

    from operator import itemgetter # itemgetter用来去dict中的key,省去了使用lambda函数 from itertools import groupby ...

  5. python编程零碎积累

    例行程序 def routine():     lastday = ''     while True:         day = datetime.datetime.now().strftime( ...

  6. Python列表中去重的多种方法

    怎么快速的对列表进行去重呢,去重之后原来的顺序会不会改变呢? 去重之后顺序会改变 set去重 列表去重改变原列表的顺序了 l1 = [1,4,4,2,3,4,5,6,1] l2 = list(set( ...

  7. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  8. python笔记之itertools模块

    python笔记之itertools模块 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生 ...

  9. Python标准库(1) — itertools模块

    简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数. itertools.chain(*iterable) ...

随机推荐

  1. JAVA 线程Join

    join方法: 当某个线程要等待另一个线程执行结束后才能继续执行时,使用join方法. public class DinnerThread { public static void main(Stri ...

  2. 【Python】多进程1

    1.    进程定义: (1) 进程是一个实体.每个进程都有他自己的地址空间,一般包括文本区域.数据区域和堆栈.进程是线程的容器. (2) 进程是一个“执行中的程序” 2.    进程的特征: (1) ...

  3. http头之keep-alive

    1.什么是keep-alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HT ...

  4. Threejs着色器基本使用样例改造

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - bu ...

  5. Oracle 10g安装报错记录

    环境描述linux 5.6 安装Oracle 10.2.0.1.0 DBCA问题 1)DBCA图形化界面,出现乱码 测试环境,操作系统中文字符编码导致 export LANG=C 2)DBCA图形化点 ...

  6. 【机器学习基础】SVM实现分类识别及参数调优(二)

    前言 实现分类可以使用SVM方法,但是需要人工调参,具体过程请参考here,这个比较麻烦,小鹅不喜欢麻烦,正好看到SVM可以自动调优,甚好! 注意 1.reshape的使用: https://docs ...

  7. python中调用多线程加速处理文件

    问题背景是这样的,我有一批需要处理的文件,对于每一个文件,都需要调用同一个函数进行处理,相当耗时 有没有加速的办法呢?当然有啦,比如说你将这些文件分成若干批,每一个批次都调用自己写的python脚本进 ...

  8. ZOJ - 4089 :Little Sub and Isomorphism Sequences (同构 set)

    Little Sub has a sequence . Now he has a problem for you. Two sequences of length and of length are ...

  9. Sping boot 之 @Value("${xxx}") 注解获取配置文件内容

    1.注解方式读取 1-1.@PropertySource配置文件路径设置,在类上添加注解,如果在默认路径下可以不添加该注解. 需要用@PropertySource的有: 例如非application. ...

  10. asm.js 和 Emscripten 入门教程

    http://www.ruanyifeng.com/blog/2017/09/asmjs_emscripten.html