本篇閱讀的代碼片段來自于30-seconds-of-python。
1. count_by
1
2
3
4
5
6
7
8
9
10
|
def count_by(arr, fn = lambda x: x): key = {} for el in map (fn, arr): key[el] = 1 if el not in key else key[el] + 1 return key # EXAMPLES from math import floor count_by([ 6.1 , 4.2 , 6.3 ], floor) # {6: 2, 4: 1} count_by([ 'one' , 'two' , 'three' ], len ) # {3: 2, 5: 1} |
count_by
根據給定的函數對列表中的元素進行分組,并返回每組中元素的數量。該使用map()
使用給定函數映射給定列表的值。在映射上迭代,并在每次出現時增加元素數。
該函數使用not in
判斷目前字典中是否含有指定的key
,如果不含有,就將該key
加入字典,并將對應的value
設置為1;如果含有,就將value
加1。
2. 使用字典推導式
字典推導式有{ key_expr: value_expr for value in collection if condition }
這樣的形式。group_by
函數中字典推導式的value_expr
是一個列表,該列表使用了列表推導式來生成。即
1
|
{ key_expr: [x for x in collection2 if condition2] for value in collection1 if condition1 } |
同時,我們可以看到根據group_by
代碼中的字典推導式,可能計算出key相同的項,根據Pyrhon
中字典的類型的規則,key相同的,只保留最新的key-value
對。實際上當key相同時,value值也一樣。[el for el in lst if fn(el) == key]
推導式的for語句中只有key一個變量。
1
2
3
4
5
6
7
|
>>> d = { 'one' : 1 , 'two' : 2 , 'three' : 3 , 'two' : 2 } >>> d { 'one' : 1 , 'two' : 2 , 'three' : 3 } >>> d = { 'one' : 1 , 'two' : 2 , 'three' : 3 , 'two' : 22 } >>> d { 'one' : 1 , 'two' : 22 , 'three' : 3 } >>> |
這里也可以使用同樣的方式,在分組之后直接獲取列表長度。不過這種寫法遍歷了兩次列表,會使程序效率變低。
1
2
|
def count_by(lst, fn): return {key : len ([el for el in lst if fn(el) = = key]) for key in map (fn, lst)} |
3. 使用collections.defaultdict簡化代碼
1
|
class collections.defaultdict([default_factory[, ...]]) |
collections.defaultdict
包含一個default_factory
屬性,可以用來快速構造指定樣式的字典。
當使用int
作為default_factory
,可以使defaultdict
用于計數。因此可以直接使用它來簡化代碼。相比字典推導式的方法,只需要對列表進行一次循環即可。
1
2
3
4
5
6
7
|
from collections import defaultdict def count_by(lst, fn): d = defaultdict( int ) for el in lst: d[fn(el)] + = 1 return d |
當使用 list
作為 default_factory
時,很輕松地將(鍵-值對組成的)序列轉換為(鍵-列表組成的)字典。
1
2
3
4
5
6
7
8
9
10
|
def group_by(lst, fn): d = defaultdict( list ) for el in lst: d[fn(el)].append(el) return d # EXAMPLES from math import floor group_by([ 6.1 , 4.2 , 6.3 ], floor) # {4: [4.2], 6: [6.1, 6.3]} group_by([ 'one' , 'two' , 'three' ], len ) # {3: ['one', 'two'], 5: ['three']} |
到此這篇關于Python代碼實現列表分組計數的文章就介紹到這了,更多相關Python列表分組計數內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://segmentfault.com/a/1190000040668316