itertools.groupby()/itertools.compress() 筆記


關於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]

 

如果覺得慢,還可以使用生成器來代替


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM