一. 如何根據(jù)字典中值的大小,對字典中的項(xiàng)進(jìn)行排序
實(shí)際案例:
- 某班英語成績以字典形式存儲為:
{"LiLei": 79, "Jim" : 88, "Lucy": 90}
根據(jù)成績高低計(jì)算學(xué)生排名
解決方案:
使用內(nèi)置函數(shù)sroted
- 利用zip將字典數(shù)據(jù)轉(zhuǎn)化元組
- 傳遞sorted函數(shù)的key參數(shù)
代碼示例:
# _*_ coding:utf-8 _*_
# @Author : TianYu
# @Time : 2017/10/9 15:22
# @File : 對字典中的項(xiàng)進(jìn)行排序.py
from random import randint
d = {x: randint(60,100) for x in "xyzabc"} #生成隨機(jī)的字典數(shù)據(jù)
print(d)
#方法 1
s= list(zip(d.values(), d.keys())) # zip(iter1 [,iter2 [...]]) --> zip object
print(sorted(s))
#方法 2
print(d.items())
print(sorted(d.items(), key=lambda x: x[1]))
二. 如何快速找到多個字典中的公共鍵(key)
實(shí)際案例:
- 西班牙足球甲級聯(lián)賽,每輪球員進(jìn)球統(tǒng)計(jì):
第一輪:{'蘇雷亞斯' : 1, '梅西' :2, '本澤馬': 1, 'C羅': 3 ...}
第二輪:{'蘇雷亞斯' : 2, 'C羅' :1, '格里茲曼': 3, '貝爾': 1 ...}
第三輪:{'蘇雷亞斯' : 1, '托雷斯' :2, '貝爾': 1, '內(nèi)馬爾': 1 ...}
......
統(tǒng)計(jì)出前N輪,每場比賽都有進(jìn)球的球員
解決方案:
利用集合set的交集操作
step1.使用字典的keys()方法,得到一個字典keys的集合
step2. 使用map函數(shù),得到所有字典的keys的集合
step3. 使用functools中的reduce函數(shù),取所有字典的keys的集合的交集
代碼示例:
#!usr/bin/env python3
# _*_ coding:utf-8 _*_
# @Author : TianYu
# @Time : 2017/9/18 19:39
# @File : 草稿本.py
from random import randint, sample
#sample 函數(shù)隨機(jī)取樣
#取三個樣本字典數(shù)據(jù)
s1 = {x: randint(1,4) for x in sample('abcdefg', randint(3,6))}
s2 = {x: randint(1,4) for x in sample('abcdefg', randint(3,6))}
s3 = {x: randint(1,4) for x in sample('abcdefg', randint(3,6))}
print(s1, s2, s3)
#方法 1 (不推薦,容易造成內(nèi)存浪費(fèi)或者效率較低)
res = []
for k in s1:
if k in s2 and k in s3:
res.append(k)
print(res)
#方法 2
print(s1.keys() & s2.keys() & s3.keys())#集合的交集
#方法 3
from functools import reduce
ss = reduce(lambda a, b: a & b,map(dict.keys,[s1,s2,s3]) )#map函數(shù)和reduce函數(shù)的使用,可以對N個字典進(jìn)行處理
print(ss)
三. 如何讓字典保持有序
實(shí)際案例:
- 某編程競賽系統(tǒng),對參賽選手編程解題進(jìn)行計(jì)時,選手完成題目后,把該選手解題用時記錄到字典中,以便賽后按選手名查詢成績(答題用時越短,成績越優(yōu))
{'LiLei':(2,43), 'HanMeimei':(5,52), 'Jim':(1,39) ...}
比賽結(jié)束后,需按排名順序依次打印選手成績,如何實(shí)現(xiàn)?
解決方案:
使用collections.OrderedDict
- 以OrderedDict替代內(nèi)置字典dict,依次將選手成績存入OrderedDict。
代碼示例:
# _*_ coding:utf-8 _*_
# @Author : TianYu
# @Time : 2017/10/9 15:48
# @File : 字典保持有序.py
from collections import OrderedDict
d = OrderedDict()#使用OrderedDict代替內(nèi)置的字典
d['Jin'] = (1,35)
d['Bob'] = (2,33)
d['Leo'] = (3,38)
for k in d:
print(k)#根據(jù)字典的進(jìn)入順序進(jìn)行遍歷
#使用OrderedDict有序字典的例子
from time import time
from random import randint
d = OrderedDict()
plays = list('ABCDEFGH') #選手列表['A', 'B', 'C', ...'H' ]
start = time()
print("提示:按Enter鍵或者輸入字符:")
for i in range(8):
input() #可做延時處理
p = plays.pop(randint(0, 7 - i)) #在列表中隨機(jī)選取元素,之后pop掉,相當(dāng)于“答完題離場”
end = time()
print(i + 1, p, end - start), #打印 排名、選手名、成績(時間)
d[p] = (i + 1, end - start)
print()
print('-' * 20)
for k in d:
print(k, d[k])

要努力要奮斗