from random import randint
d ={
k: randint(60,100)for k in'abcdefgh'}# 方案一
l =[(v, k)for k, v in d.items()]# l = list(zip(d.values(), d.keys()))
res1 =sorted(l, reverse=True)# 方案二 推荐
p =sorted(d.items(), key =lambda item: item[1], reverse=True)# 获得 次序
res2 ={
k:(i, v)for i ,(k, v)inenumerate(p,1)}
4. 如何统计序列中元素的出现频度?
data =[randint(0,20)for _ inrange(30)]# 方案一
d =dict.fromkeys(data,0)for x in data:
data[x]+=1# 使用列表式解析sorted([(v, k)for k, v in d.items()], reverse=True)# 使用生成式解析sorted(((v, k)for k, v in d.items()), reverse=True)# top 3sorted(((v, k)for k, v in d.items()), reverse=True)[:3]# 或者使用 heapq,避免列表过大时import heapq
# 最小:heapq.nsmallest()
heapq.nlargest(3,((v, k)for k, v in d.items()))# 方案二 推荐from collections import Counter
c = Counter(data)
c.most_common(3)# 例子: 统计文本中的Top 10 单词
txt =open('Article.txt').read()import re
word_list = re.split('\W+', txt)
c2 = Counter(word_list)
c2.most_common(10)
5. 如何让字典保持有序?
'''如何让字典保持有序?'''# 字典是一种无序的数据结构# 使用 OrderedDictfrom collections import OrderedDict
players =list('abcdeggh')from random import shuffle
shuffle(players)
od = OrderedDict()for i, p inenumerate(players,1):
od[p]= i
# 实现一个基于 key 返回名次的借口defquer_by_name(d, name):return d[name]# OrderedDict 虽然是有序的,但是不支持 切片操作,解决办法是使用 islicefrom itertools import islice
defquery_by_order(d, a, b=None):
a -=1if b isNone:
b = a +1returnlist(islice(od, a, b))# 查询 第 4 名
query_by_order(od,4)# 查询 3 - 6 名
query_by_order(od,3,6)
6. 如何快速找到多个字典中的公共键?
from random import sample
d1 ={
k: randint(1,4)for k in sample('abcdefgh', randint(3,6))}
d2 ={
k: randint(1,4)for k in sample('abcdefgh', randint(3,6))}
d3 ={
k: randint(1,4)for k in sample('abcdefgh', randint(3,6))}# 方案一for k in d1:if k in d2 and k in d3:print(k)# 列表长度任意
dl =[d1, d2, d3]
res1 =[k for k in dl[0]ifall(map(lambda d: k in d, dl[1:]))]# 方案二 推荐from functools importreducereduce(lambda a, b: a & b,map(dict.keys, dl))
7. 如何实现用户的历史记录功能(最多N条)?
8. 如何进行反向迭代以及如何实现反向迭代?
classFloatRange:def__init__(self, a, b, step):super().__init__()
self.a = a
self.b = b
self.step = step
def__iter__(self):
t = self.a
while t <= self.b:yield t
t += self.step
def__reversed__(self):
t = self.b
while t >= self.a:yield t
t -= self.step
# 这样实现是不是就搞定了?
fr = FloatRange(3.0,4.0,0.2)for x in fr:print(x)print('*'*10)for x inreversed(fr):print(x)# 上面的实现会随着精度不准逐渐累加导致非预期的结果# 解决办法是使用 Decimalfrom decimal import Decimal
classFloatRange:def__init__(self, a, b, step):super().__init__()
self.a = Decimal(str(a))
self.b = Decimal(str(b))
self.step = Decimal(str(step))def__iter__(self):
t = self.a
while t <= self.b:yieldfloat(