一. 如何根据字典中值的大小,对字典中的项进行排序
实际案例:
- 某班英语成绩以字典形式存储为:
{"LiLei": 79, "Jim" : 88, "Lucy": 90}
根据成绩高低计算学生排名
解决方案:
使用内置函数sroted
- 利用zip将字典数据转化元组
- 传递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, '梅西' :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)
三. 如何让字典保持有序
实际案例:
- 某编程竞赛系统,对参赛选手编程解题进行计时,选手完成题目后,把该选手解题用时记录到字典中,以便赛后按选手名查询成绩(答题用时越短,成绩越优)
{'LiLei':(2,43), 'HanMeimei':(5,52), 'Jim':(1,39) ...}
比赛结束后,需按排名顺序依次打印选手成绩,如何实现?
解决方案:
使用collections.OrderedDict
- 以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])
要努力要奋斗
网友评论