Python中的分組函式groupby及其壓縮應用

2021-10-05 18:35:23 字數 3349 閱讀 8735

我們先來看乙個題目

給定一組字元,使其壓縮,壓縮後的長度必須始終小於或等於原陣列長度。

示例 1:

輸入:

["a"

,"a"

,"b"

,"b"

,"c"

,"c"

,"c"

]輸出:

["a"

,"2"

,"b"

,"2"

,"c"

,"3"

]

說明:"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。

或者輸出乙個描述元組

輸入:

["a"

,"a"

,"b"

,"b"

,"c"

,"c"

,"c"

]輸出:[(

"a",

"2"),(

"b",

"2"),(

"c",

"3")

]

這裡就需要使用我們今天的主角groupby分組函式,需要注意的是這個是內建庫itertools裡的方法

和pandas裡面的groupby聚合函式的使用還是有很大區別的

我們首先看下原始碼

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

從注釋可以看出 groupby(iterable, key=none),乙個引數是可迭代型別資料,另外乙個為key,預設為none,按照key進行分組且說明了如果key為none或者沒有特定說明時,使用他自己的元素進行分組

可能說起來比較抽象,我們來看個例子

from itertools import groupby

lst =[1

,2,2

,3,2

,7,5

]print

(lst)

for k,v in groupby(lst)

:print

(k,list

(v))

輸出:[1,

2,2,

3,2,

7,5]

1[1]

2[2,

2]3[

3]2[

2]7[

7]5[

5]

根據這個例子,我來說明下,首先需要引入庫,然後呼叫函式時,沒有傳入key,你會發現

這個可迭代型別會按照元素順序依次取出,按照元素本身進行分組(保證每個分組裡都有元素)。

我們看到結果是前乙個元素為分組的條件,後乙個為原可迭代型別進行分組後的結果

這裡要注意

1.是分組後的結果"v",是乙個迭代內容,是存到快取的,所以需要使用型別函式接收下,才可以呼叫

2.結果是按照迭代型別裡的順利排列的,你會發現第五次迭代的2沒有放進第二次裡面

所以,這裡就體現了key的作用,key其實填入的就是排序方式

from itertools import groupby

lst =[1

,2,2

,3,2

,7,5

]print

(lst)

for k,v in groupby(lst,key=lst.sort())

:print

(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:

print

(list_a)

print

(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...