python高级编程技巧(2)

一. 如何根据字典中值的大小,对字典中的项进行排序

实际案例:

  1. 某班英语成绩以字典形式存储为:
    {"LiLei": 79, "Jim" : 88, "Lucy": 90}
    根据成绩高低计算学生排名
解决方案:

使用内置函数sroted

  1. 利用zip将字典数据转化元组
  2. 传递sorted函数的key参数
代码示例:
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/10/9 15:22
# @File     : 对字典中的项进行排序.py

from random import randint

d = {x: randint(60,100) for x in "xyzabc"} #生成随机的字典数据
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)

实际案例:

  1. 西班牙足球甲级联赛,每轮球员进球统计:
    第一轮:{'苏雷亚斯' : 1, '梅西' :2, '本泽马': 1, 'C罗': 3 ...}
    第二轮:{'苏雷亚斯' : 2, 'C罗' :1, '格里兹曼': 3, '贝尔': 1 ...}
    第三轮:{'苏雷亚斯' : 1, '托雷斯' :2, '贝尔': 1, '内马尔': 1 ...}
    ......
    统计出前N轮,每场比赛都有进球的球员
解决方案:

利用集合set的交集操作
step1.使用字典的keys()方法,得到一个字典keys的集合
step2. 使用map函数,得到所有字典的keys的集合
step3. 使用functools中的reduce函数,取所有字典的keys的集合的交集

代码示例:
#!usr/bin/env python3
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/9/18 19:39
# @File     : 草稿本.py

from random import randint, sample
#sample 函数随机取样
#取三个样本字典数据
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 (不推荐,容易造成内存浪费或者效率较低)
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函数和reduce函数的使用,可以对N个字典进行处理
print(ss)

三. 如何让字典保持有序

实际案例:

  1. 某编程竞赛系统,对参赛选手编程解题进行计时,选手完成题目后,把该选手解题用时记录到字典中,以便赛后按选手名查询成绩(答题用时越短,成绩越优)
    {'LiLei':(2,43), 'HanMeimei':(5,52), 'Jim':(1,39) ...}
    比赛结束后,需按排名顺序依次打印选手成绩,如何实现?
解决方案:

使用collections.OrderedDict

  1. OrderedDict替代内置字典dict,依次将选手成绩存入OrderedDict
代码示例:
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/10/9 15:48
# @File     : 字典保持有序.py

from collections import OrderedDict
d = OrderedDict()#使用OrderedDict代替内置的字典
d['Jin'] = (1,35)
d['Bob'] = (2,33)
d['Leo'] = (3,38)
for k in d:
    print(k)#根据字典的进入顺序进行遍历


#使用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)) #在列表中随机选取元素,之后pop掉,相当于“答完题离场”
    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])

python高级编程技巧(2)_第1张图片
要努力要奋斗

你可能感兴趣的:(python高级编程技巧(2))