python函數(shù)enumerate,operator和Counter使用技巧實(shí)例小結(jié)
本文實(shí)例講述了python函數(shù)enumerate,operator和Counter使用技巧。分享給大家供大家參考,具體如下:
最近看人家的代碼,發(fā)現(xiàn)了很多python內(nèi)置的函數(shù)和數(shù)據(jù)結(jié)構(gòu),可以大大減少我們的代碼量(而且人家是優(yōu)化過(guò)的)。python以簡(jiǎn)潔和強(qiáng)大的庫(kù)著稱,要是什么都自己寫(xiě)的話,太不python了。這里介紹常用的能大大提高我們生活幸福度的小技巧:
enumerate()
這個(gè)函數(shù)主要用于既要遍歷元素又要記下索引。通常我們都會(huì)這樣寫(xiě)(不能再笨拙了):
for i in range(0,len(list)): print i,list[i]
使用enumerate:
for index,text in enumerate(list): print index,text
itemgetter()
這個(gè)和下面的函數(shù)在operator庫(kù)中,通常用在排序中。例如要對(duì)一個(gè)tuple的列表進(jìn)行排序,找到第二個(gè)值最小的那個(gè)tuple。我一開(kāi)始這樣做:
list_of_tuples = [(1,2), (3,4), (5,0)] min_tuple = None minimum = sys.maxint for pair in list_of_tuples: x,y = pair if y < minimum: min_tuple = pair print min_tuple
后來(lái),進(jìn)化了,這樣做:
def snd(pair): x,y = pair return y list_of_tuples = [(1,2), (3,4), (5,0)] min(list_of_tuples, key=snd)
這樣看起來(lái)好多了,可是我發(fā)現(xiàn)人家的代碼里是這樣做的:
import operator list_of_tuples = [(1,2), (3,4), (5,0)] min(list_of_tuples, key=operator.itemgetter(1)) #use 2nd value
attgetter()
這個(gè)函數(shù)和上面的函數(shù)很像,不同的是,上面是用索引獲取對(duì)應(yīng)值,而這里使用屬性來(lái)獲取對(duì)應(yīng)值,就像dict一樣。
假如我們有個(gè)類Student:
class Student(object): def __init__(self, id, name, marks): self.id = id self.name = name self.marks = marks def __str__(self): return '%s has marks %s' %(self.name, self.marks)
我們有一個(gè)學(xué)生的實(shí)例的列表students,需要從里面找到分最高的。最簡(jiǎn)介的做法是:
students = [ Student(0, 'Foo', 30), Student(1, 'Bar', 95), Student(2, 'Baz', 80)] best_student = max(students, key=operator.attrgetter('marks')) # don't forget the quotes
collections.Counter()
一看這個(gè)函數(shù)名,就知道是用來(lái)統(tǒng)計(jì)個(gè)數(shù)的~返回的是一個(gè)dict,key是各個(gè)元素,value是對(duì)應(yīng)的個(gè)數(shù)。一開(kāi)始,我并不知道這個(gè)函數(shù),都是這樣統(tǒng)計(jì)的:
d={} for text in list: if not text in d.keys(): d[text]=1 else: d[text]+=1 print d
現(xiàn)在,直接一句話:
counter=collections.Counter(list) print counter
之后獲取各元素的個(gè)數(shù),使用方法同一般的dict。如果增加元素e1,e2和對(duì)應(yīng)個(gè)數(shù),直接counter.update({e1=4,e2=3})就可以。
此外,這個(gè)Counter不僅用來(lái)數(shù)數(shù),還有好多函數(shù)方便各種操作,例如:
- counter.most_common(n) 返回?cái)?shù)目最多的前n個(gè)元素和對(duì)應(yīng)個(gè)數(shù)
- a.substract(b) 返回一個(gè)Counter,Counter a減去Counter b,多的元素個(gè)數(shù)為正值,少的元素個(gè)數(shù)為負(fù)值
- counter.elements() 返回一個(gè)element列表,其中每個(gè)元素有多少個(gè)就重復(fù)多少次
- counter.values() 返回個(gè)數(shù)列表,通常配合sum(counter.values())
- counter.clear() 重置counter
- del counter[e]刪除元素e和它的紀(jì)錄
- 算數(shù)操作:+和- ,對(duì)應(yīng)元素個(gè)數(shù)加減;|和&,兩個(gè)counter的并集和交集
關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python函數(shù)使用技巧總結(jié)》、《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python實(shí)現(xiàn)各進(jìn)制轉(zhuǎn)換的總結(jié)大全
這篇文章主要給大家總結(jié)了python實(shí)現(xiàn)各進(jìn)制轉(zhuǎn)換的相關(guān)資料,其中包括字符串與十六進(jìn)制轉(zhuǎn)換、內(nèi)置函數(shù)hex()與進(jìn)制互轉(zhuǎn)等相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-06-0613個(gè)你可能未使用過(guò)的Python特性分享
Python?是頂級(jí)編程語(yǔ)言之一,它具有許多程序員從未使用過(guò)的許多隱藏功能。在這篇博客中,將和大家分享一下你可能從未使用過(guò)的13?個(gè)?Python?特性,感興趣的可以學(xué)習(xí)一下2022-11-11Python 正則表達(dá)式 re . 符號(hào)示例詳解
(點(diǎn)號(hào)) 在默認(rèn)模式下,匹配除換行符以外的任意字符, 如果指定了 flags 參數(shù) DOTALL ,它將匹配包括換行符在內(nèi)的任意字符,下面通過(guò)示例代碼介紹Python 正則表達(dá)式 re . 符號(hào),感興趣的朋友跟隨小編一起看看吧2024-05-05python使用正則搜索字符串或文件中的浮點(diǎn)數(shù)代碼實(shí)例
這篇文章主要介紹了python使用正則搜索字符串或文件中的浮點(diǎn)數(shù)代碼實(shí)例,同時(shí)包含一個(gè)讀寫(xiě)到文件功能,需要的朋友可以參考下2014-07-07python利用urllib和urllib2訪問(wèn)http的GET/POST詳解
urllib模塊提供的上層接口,使我們可以像讀取本地文件一樣讀取www和ftp上的數(shù)據(jù)。下面這篇文章主要給大家介紹了關(guān)于python如何利用urllib和urllib2訪問(wèn)http的GET/POST的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09python實(shí)現(xiàn)接口并發(fā)測(cè)試腳本
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)接口并發(fā)測(cè)試腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06