Python代碼實(shí)現(xiàn)列表分組計(jì)數(shù)
本篇閱讀的代碼片段來自于30-seconds-of-python。
1. count_by
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
根據(jù)給定的函數(shù)對列表中的元素進(jìn)行分組,并返回每組中元素的數(shù)量。該使用map()
使用給定函數(shù)映射給定列表的值。在映射上迭代,并在每次出現(xiàn)時(shí)增加元素?cái)?shù)。
該函數(shù)使用not in
判斷目前字典中是否含有指定的key
,如果不含有,就將該key
加入字典,并將對應(yīng)的value
設(shè)置為1;如果含有,就將value
加1。
2. 使用字典推導(dǎo)式
字典推導(dǎo)式有{ key_expr: value_expr for value in collection if condition }
這樣的形式。group_by
函數(shù)中字典推導(dǎo)式的value_expr
是一個(gè)列表,該列表使用了列表推導(dǎo)式來生成。即
{ key_expr: [x for x in collection2 if condition2] for value in collection1 if condition1 }
同時(shí),我們可以看到根據(jù)group_by
代碼中的字典推導(dǎo)式,可能計(jì)算出key相同的項(xiàng),根據(jù)Pyrhon
中字典的類型的規(guī)則,key相同的,只保留最新的key-value
對。實(shí)際上當(dāng)key相同時(shí),value值也一樣。[el for el in lst if fn(el) == key]
推導(dǎo)式的for語句中只有key一個(gè)變量。
>>> 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} >>>
這里也可以使用同樣的方式,在分組之后直接獲取列表長度。不過這種寫法遍歷了兩次列表,會使程序效率變低。
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簡化代碼
class collections.defaultdict([default_factory[, ...]])
collections.defaultdict
包含一個(gè)default_factory
屬性,可以用來快速構(gòu)造指定樣式的字典。
當(dāng)使用int
作為default_factory
,可以使defaultdict
用于計(jì)數(shù)。因此可以直接使用它來簡化代碼。相比字典推導(dǎo)式的方法,只需要對列表進(jìn)行一次循環(huán)即可。
from collections import defaultdict def count_by(lst, fn): d = defaultdict(int) for el in lst: d[fn(el)] += 1 return d
當(dāng)使用 list
作為 default_factory
時(shí),很輕松地將(鍵-值對組成的)序列轉(zhuǎn)換為(鍵-列表組成的)字典。
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']}
到此這篇關(guān)于Python代碼實(shí)現(xiàn)列表分組計(jì)數(shù)的文章就介紹到這了,更多相關(guān)Python列表分組計(jì)數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
TensorFlow深度學(xué)習(xí)之實(shí)現(xiàn)合并與分割的示例代碼
這篇文章主要為大家詳細(xì)介紹了TensorFlow中實(shí)現(xiàn)合并與分割的四位函數(shù)以及它們的用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-07-07Python字符串操作實(shí)戰(zhàn)之如何提取子字符串
這篇文章主要給大家介紹了關(guān)于Python字符串操作實(shí)戰(zhàn)之如何提取子字符串的相關(guān)資料,字符串是Python中最常用的數(shù)據(jù)類型,大家應(yīng)該都不陌生,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06使用APScheduler3.0.1 實(shí)現(xiàn)定時(shí)任務(wù)的方法
今天小編就為大家分享一篇使用APScheduler3.0.1 實(shí)現(xiàn)定時(shí)任務(wù)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07selenium+python自動化78-autoit參數(shù)化與批量上傳功能的實(shí)現(xiàn)
這篇文章主要介紹了selenium+python自動化78-autoit參數(shù)化與批量上傳,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Python+Sklearn實(shí)現(xiàn)異常檢測
這篇文章主要為大家詳細(xì)介紹了Python如何利用Sklearn實(shí)現(xiàn)異常檢測,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-12-12python 移動圖片到另外一個(gè)文件夾的實(shí)例
今天小編就為大家分享一篇python 移動圖片到另外一個(gè)文件夾的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01如何使用Python JSON解析和轉(zhuǎn)換數(shù)據(jù)
JSON 是文本,使用 JavaScript 對象表示法編寫,Python 有一個(gè)內(nèi)置的 json 包,可用于處理 JSON 數(shù)據(jù),本文給大家介紹使用Python JSON解析和轉(zhuǎn)換數(shù)據(jù)的方法,感興趣的朋友跟隨小編一起看看吧2023-11-11Python word文本自動化操作實(shí)現(xiàn)方法解析
這篇文章主要介紹了Python word文本自動化操作實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11關(guān)于Django框架的關(guān)系模型序列化和一對多關(guān)系中的序列化解析
序列化的意思是把字典的形式轉(zhuǎn)化成Json格式。當(dāng)我們展示數(shù)據(jù)的時(shí)候需要使用,反序列化的話,就是Json轉(zhuǎn)成字典形式,存儲數(shù)據(jù)時(shí)候使用,需要的朋友可以參考下2023-05-05