我們先來看乙個題目
給定一組字元,使其壓縮,壓縮後的長度必須始終小於或等於原陣列長度。
示例 1:
說明:"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。輸入:
["a"
,"a"
,"b"
,"b"
,"c"
,"c"
,"c"
]輸出:
["a"
,"2"
,"b"
,"2"
,"c"
,"3"
]
或者輸出乙個描述元組
這裡就需要使用我們今天的主角groupby分組函式,需要注意的是這個是內建庫itertools裡的方法輸入:
["a"
,"a"
,"b"
,"b"
,"c"
,"c"
,"c"
]輸出:[(
"a",
"2"),(
"b",
"2"),(
"c",
"3")
]
和pandas裡面的groupby聚合函式的使用還是有很大區別的
我們首先看下原始碼
從注釋可以看出 groupby(iterable, key=none),乙個引數是可迭代型別資料,另外乙個為key,預設為none,按照key進行分組且說明了如果key為none或者沒有特定說明時,使用他自己的元素進行分組class
groupby
(object):
""" groupby(iterable, key=none) -> make an iterator that returns consecutive
keys and groups from the iterable. if the key function is not specified or
is none, the element itself is used for grouping.
"""def__getattribute__
(self,
*args,
**kwargs)
:# real signature unknown
""" return getattr(self, name). """
pass
def__init__
(self, iterable, key=
none):
# known case of itertools.groupby.__init__
""" initialize self. see help(type(self)) for accurate signature. """
pass
def__iter__
(self,
*args,
**kwargs)
:# real signature unknown
""" implement iter(self). """
pass
可能說起來比較抽象,我們來看個例子
根據這個例子,我來說明下,首先需要引入庫,然後呼叫函式時,沒有傳入key,你會發現from itertools import groupby
lst =[1
,2,2
,3,2
,7,5
(lst)
for k,v in groupby(lst)
(k,list
(v))
輸出:[1,
2,2,
3,2,
7,5]
1[1]
2[2,
2]3[
3]2[
2]7[
7]5[
5]
這個可迭代型別會按照元素順序依次取出,按照元素本身進行分組(保證每個分組裡都有元素)。
我們看到結果是前乙個元素為分組的條件,後乙個為原可迭代型別進行分組後的結果
這裡要注意
1.是分組後的結果"v",是乙個迭代內容,是存到快取的,所以需要使用型別函式接收下,才可以呼叫
2.結果是按照迭代型別裡的順利排列的,你會發現第五次迭代的2沒有放進第二次裡面
所以,這裡就體現了key的作用,key其實填入的就是排序方式
這裡可能有人會問,這樣和把列表排序後再進行分組有啥區別呢?from itertools import groupby
lst =[1
,2,2
,3,2
,7,5
(lst)
for k,v in groupby(lst,key=lst.sort())
(k,list
(v))
輸出:[1,
2,2,
3,2,
7,5]
1[1]
2[2,
2,2]
3[3]
5[5]
7[7]
其實沒有區別,但是這是針對一維資料,如果是多維資料的話,這個就很方便了
這樣上面問題就很好解決了
其實這裡面還有很多玩法,可以自己去試試from itertools import groupby
groups_first =
[k for k,v in groupby(
["a"
,"a"
,"b"
,"b"
,"c"
,"c"
,"c"])
]counts =
[len
(list
(v))
for k,v in groupby(
["a"
,"a"
,"b"
,"b"
,"c"
,"c"
,"c"])
]list_a =
list
(zip
(counts,groups_first)
)list_b =
for n, h in list_a:
(list_a)
(list_b)
輸出:[(2
,'a'),
(2,'b'),
(3,'c')]
['a',2
,'b',2
,'c',3
]
python分組函式的使用 groupby
專案使用場景 需要對乙個包含字典的列表進行資料格式的轉化,指定 dict 中某個具體 key 的value 作為 新的 key,新的 value 是乙個列表,包含了原始的那些資料 from itertools import groupby from operator import itemgette...
Linux網路子系統中鏈路層中GRO的處理
根據上篇博文的介紹,gro需要支援gro的每種協議都要實現自己的報文匹配合併函式和合併完成函式。這裡我們先來看看鏈路層上 實現的自己的gro函式。鏈路層的接收匹配函式 napi gro receive napi,skb 該函式對報文進行匹配,並不合併報文。匹配規則 必須同時滿足以下兩個條件 1 兩個...
python高階之正則中的分組
import re phone number phone 15647854549 分組 match obj re.match phone 1 0 9 phone number if match obj result match obj.group print result phone 1564785...