python高級編程技巧(2)

一. 如何根據(jù)字典中值的大小,對字典中的項(xiàng)進(jìn)行排序

實(shí)際案例:

  1. 某班英語成績以字典形式存儲為:
    {"LiLei": 79, "Jim" : 88, "Lucy": 90}
    根據(jù)成績高低計(jì)算學(xué)生排名
解決方案:

使用內(nèi)置函數(shù)sroted

  1. 利用zip將字典數(shù)據(jù)轉(zhuǎn)化元組
  2. 傳遞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í)際案例:

  1. 西班牙足球甲級聯(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í)際案例:

  1. 某編程競賽系統(tǒng),對參賽選手編程解題進(jìn)行計(jì)時,選手完成題目后,把該選手解題用時記錄到字典中,以便賽后按選手名查詢成績(答題用時越短,成績越優(yōu))
    {'LiLei':(2,43), 'HanMeimei':(5,52), 'Jim':(1,39) ...}
    比賽結(jié)束后,需按排名順序依次打印選手成績,如何實(shí)現(xiàn)?
解決方案:

使用collections.OrderedDict

  1. 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])

要努力要奮斗
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容