Python 高级编程之百问

Python 高级编程之百问

1. 如何在列表、字典、集合中根据条件筛选数据?

在这里插入图片描述

2. 如何为元组中每个元素命名,提高程序可读性?

在这里插入图片描述

3. 如何根据字典中值的大小,对字典中的项排序?

在这里插入图片描述

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) in enumerate(p, 1)}

4. 如何统计序列中元素的出现频度?

在这里插入图片描述

data = [randint(0, 20) for _ in range(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 3
sorted(((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. 如何让字典保持有序?

在这里插入图片描述

'''如何让字典保持有序?'''
# 字典是一种无序的数据结构
# 使用 OrderedDict
from collections import OrderedDict
players = list('abcdeggh')
from random import shuffle
shuffle(players)
od = OrderedDict()
for i, p in enumerate(players, 1):
    od[p] = i

# 实现一个基于 key 返回名次的借口
def quer_by_name(d, name):
    return d[name]

# OrderedDict 虽然是有序的,但是不支持 切片操作,解决办法是使用 islice
from itertools import islice
def query_by_order(d, a, b=None):
    a -= 1
    if b is None:
        b = a + 1
    return list(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] if all(map(lambda d: k in d, dl[1:]))]

# 方案二 推荐
from functools import reduce
reduce(lambda a, b: a & b, map(dict.keys, dl))

7. 如何实现用户的历史记录功能(最多N条)?

在这里插入图片描述

8. 如何进行反向迭代以及如何实现反向迭代?

在这里插入图片描述

class FloatRange:
    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 in reversed(fr):
    print(x)
# 上面的实现会随着精度不准逐渐累加导致非预期的结果
# 解决办法是使用 Decimal
from decimal import Decimal
class FloatRange:
    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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值