iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 27
0

還記得sorted()嗎?我們今天來更完整呈現sorted(iterable,key,reverse)的樣貌
其實在這個函數裡面所說的:只要是一個可迭代(iterable)的對象,例如:list,range等等,就可以進行排序,所以重點是要讓想要操作排序的對象可以迭代,或者操作對象的index進行排序。因此在過去幾天我們已經至少完整介紹比較進階的排序
然而今天我們要來介紹dict的排序,並且完成昨天的作業。

  • 針對key值對字典進行排序
    dict要看key值不外乎就是使用.keys(),若去看他的型態就知道在python中屬於class(<class 'dict_keys'>),因此如果直接print(dict.keys())會輸出的是dict_keys([...]),而這樣的型態在python裡面是屬於iterable,因此可以直接進行排序,但不要忘了!sorted(dict.keys())只能依照key值的大小進行排序
k={'Apple':400,'Joey':600,'Bella':50,'2th King':10000}
print(sorted(k.keys()))
#output:['2th King', 'Apple', 'Bella', 'Joey']
  • 針對value值對字典進行排序
    然而因為dict在python中是不可迭代的對象,因此我們會先透過.items()先將資料型態轉成可迭代的對象後,在這裡可迭代的對象會轉成元組(tuple),資料會以小括號(var_1,var_2,....)儲存,其index的編號方式和list希同,但tuple可看成一個不可修改的list,因此許多在list中有關修改的指令街不可以使用。接著再利用我們之前所學的lambda來幫忙排序,有關詳細進階的排序的說明在此。這個方法所得到的結果當然會是一個以tuple排序後存在list。
k={'Apple':400,'Joey':600,'Bella':50,'2th King':10000}
print(sorted(k.items(), key=lambda x:x[1]))
#output:[('Bella', 50), ('Apple', 400), ('Joey', 600), ('2th King', 10000)]

範例實踐

這是我們昨天的測資data,那該怎麼做呢?

  1. 會先用到昨天所學的開檔案的方法,並將檔案讀進來
  2. 因需要把相同人員的成績全部加總起來,其實可以創造一個list,index從0~25分別儲存a~z的分數,然而會發現這樣的操作方法會浪費很多空間和時間,而且每一次查找index都要浪費一次時間,可說是費時費力。
  3. 這裡使用dict的方式,利用之前Day24的內容將逐步將資料分類,既有的名稱(key)直接將其多的值加上去,沒有的創造一個新的key並賦予值。這裡我們使用dict.setdefault(key,value)

dict.setdefault(key,value)

類似於get()方法,如果key不存在dict中,則會新增key,並賦予一個value。以下我們提供一個範例

dict={1: 4, '1': [5,7,3]}
dict.setdefault('1', []).append(112)
print(dict)
#output:{1: 4, '1': [5, 7, 3, 112]}
dict.setdefault('a', []).append(902)
print(dict)
#output:{1: 4, '1': [5, 7, 3, 112], 'a': [902]}

以下是參考做法

這裡將提供兩個方法

  • 法1:蒐集dict的keys()變成一個list,利用類似list中sorting index的方法,透過lambda指定特定值給key後進行排序,會後利用key的排序結果來輸出我們需要的答案。這個方法不同於前面直接針對key排序!詳細觀念請看進階的排序
  • 法2:直接利用.items(),先將資料型態轉為tuple,再進行排序
f=open('data.txt','r')

collection={}
for line in f.readlines():
	L=line.replace('\n','').split(',')
	#print(L)
	if (L[0] in collection):
		collection[L[0]]=collection[L[0]]+round(float(L[1]),1)
	else:
		collection.setdefault(L[0],round(float(L[1]),1))
f.close()

#sorting by index
ke=list(collection.keys())
rank_sort_key=sorted(ke,key= lambda ke:collection[ke],reverse=True)
print('sorting by index')
for i in rank_sort_key:
	print('{},{:3.1f}'.format(i,collection[i]))

#sorting whole collection
rank_1=sorted(collection.items(), key =lambda x : x[1],reverse=True)
print('sorting whole collection')
for i in range(len(rank_1)):
	print('{},{:3.1f}'.format(rank_1[i][0],rank_1[i][1]))

Answer:
g,43.3
x,40.8
e,30.3
d,30.1
y,25.4
a,24.8
t,23.5
o,23.5
k,22.0
q,22.0
j,21.8
n,20.8
s,20.8
i,19.9
b,18.3
r,17.6
v,16.9
h,15.9
m,15.3
w,14.6
l,10.9
f,9.5
z,8.2
u,7.1
c,3.7
p,2.6

從這個題目可以發現,程式是需要看到你遇到什麼樣的題目進行設計,沒有一定的方法對或錯,只要能解出來的就是好方法!也可以發現到題目會遇到的東西也會愈來愈廣,能把所有東西綜合性使用在programming才是真的能融會貫通!
剩不到幾天!加油!


上一篇
[Day30] 腫麼讀由你
下一篇
[Day32] 物件不但是dict還可以封裝?
系列文
從0開始學習程式-Python32

尚未有邦友留言

立即登入留言