有這么幾組數(shù)據(jù)需要你處理:
James 2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22
Julia 2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21
Mikey 2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
Sarah 2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55
這是他們四個(gè)人跑600米花費(fèi)的時(shí)間,現(xiàn)在需要用python實(shí)現(xiàn)找到每個(gè)選手跑得最快的三個(gè)時(shí)間。
首先,自然是分解數(shù)據(jù),用split(",")得到列表。然后排序,說道排序,python里有兩種排序方法:
1.原地排序:列表方法sort()排序完成后會(huì)替換掉原來的數(shù)據(jù),原有順序會(huì)消失
2.復(fù)制排序:內(nèi)置函數(shù)sorted(),復(fù)制原有數(shù)據(jù),在排序完成后返回,原有數(shù)據(jù)和順序依然保留
打開IDLE試試下面的代碼:
>>> data=[1,2,7,5,3,8]>>> sorted(data)>>> data.sort()>>> data
那么接下來試試給上面的選手?jǐn)?shù)據(jù)排序吧。
排序結(jié)果肯定不行,因?yàn)闆]有處理列表里的數(shù)據(jù),仔細(xì)看數(shù)據(jù),有2-34,3:21,2.34這些符號(hào)不同,所以要先統(tǒng)一符號(hào)。
統(tǒng)一成數(shù)字吧,這樣最方便排序了。想想前面學(xué)的的東西,要怎么處理呢?關(guān)鍵字:循環(huán)、替換
def sanitize(timestr): if ("-" in timestr) or (":" in timestr): return timestr.replace("-", ".").replace(":", ".") else: return timestrnewdata=[]def sortdata(data): for item in data: newdata.append(sanitize(item))
return newdata
2.函數(shù)串鏈,同方法串鏈,但函數(shù)串鏈?zhǔn)菑挠蚁蜃髨?zhí)行,如:print(sorted(newdata))先用sorted函數(shù)對(duì)newdata排序,然后print函數(shù)打印
另外sort()和sorted()默認(rèn)都是升序排列,如果需要降序,則需要傳入?yún)?shù)reverse=True
如果你嫌循環(huán)的代碼太多的話(這也叫多?)可以使用列表推導(dǎo):
def sortdata(data): newdata = [sanitize(item) for item in data]
# 首先是轉(zhuǎn)換 使用循環(huán)表示所有項(xiàng)都進(jìn)行轉(zhuǎn)換 最后返回列表 return newdata
你可以試試列表推導(dǎo),比如將列表里的所有值乘以2,轉(zhuǎn)換列表大小寫等等。列表推導(dǎo)真的非常強(qiáng)大。不過也不是完滿無缺,列表推導(dǎo)會(huì)轉(zhuǎn)換列表內(nèi)的所有值,所以如果你只想改變符合條件的值,還是用循環(huán)迭代吧
好了,排序完成,就可以取出前3的數(shù)據(jù)了,還記得嗎newdata[0,3](再啰嗦一下:包含左邊不含右邊)
但還有一個(gè)問題:重復(fù)項(xiàng)。可以用循環(huán)判斷,但這樣太麻煩了,python已經(jīng)給我們提供了集合來解決問題。
集合里的數(shù)據(jù)是不允許重復(fù)的,如果想往集合里添加重復(fù)項(xiàng),集合會(huì)忽略。
result=set(newdata)
創(chuàng)建集合用set()函數(shù),把列表里的數(shù)據(jù)放入集合,他會(huì)自動(dòng)幫你去除重復(fù)項(xiàng),然后在進(jìn)行排序取前3,這里你能自己解決嗎?
總結(jié):
1.原地排序:排序后替換,復(fù)制排序:排序后返回,參數(shù)reverse=True可以實(shí)現(xiàn)降序排序
2.方法串鏈:從左至右,對(duì)數(shù)據(jù)應(yīng)用一組方法,函數(shù)串鏈:從右至左,對(duì)數(shù)據(jù)應(yīng)用一組函數(shù)
3.如果要轉(zhuǎn)換整個(gè)列表里的值,可以使用列表推導(dǎo)
4.訪問列表里的多個(gè)數(shù)據(jù)項(xiàng)可以使用分片mylist[3,6](含左不含右)
5.使用set()可以創(chuàng)建一個(gè)集合,集合是不允許重復(fù)數(shù)據(jù)項(xiàng)的
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注