L15-Python cookbook 数据结构与算法练习题

2023-05-16

文章目录

    • 1. 解压赋值给多个变量
    • 2. 解压可迭代对象赋值给多个变量
    • 3. 查找集合中最大/最小的N个元素-heap
    • 4. 处理字典中的多值映射的两种方式-defaultdict()
    • 5. 排序字典的键值对元素-OreredDict
    • 6. 查找字典的相同点
    • 7. 命名切片-slice()
    • 8. 计算序列中出现次数最多的元素-Counter
    • 9. 按关键字排序字典列表-itemgetter()
    • 10. 提取字典中的子集
    • 11. 合并字典-update()

最近在看Python cookbook, 总结下书中的涉及部分比较骚的操作用例。仅作分享。

1. 解压赋值给多个变量

# 解压赋值可用在任何可迭代的对象上,包括列表、元组、字符串、文件对象、迭代器和生成器
p = (4, 5)
x, y = p
print(x, y)

data = ['ACMDE', 50, 9.11, (2012, 8, 3)]
name, shares, price, date = data
print(name, shares, price, date)

name, shares,price,(year,mon,day) = data
print(year, mon, day)

# 字符串
s = 'Hello'
a, b, c, d, e=s
print('字符串解压:', a, b, c, d, e)

# 部分解压
_, shares, price, _ = data
print('部分解压:',shares, price)

2. 解压可迭代对象赋值给多个变量

场景1:被解压元素不确定 - 星号表达式
场景2:利用废弃名称 _ 或ign , 丢弃被解压的元素 -

# *phones 的返回值,永远都是列表类型,哪怕元素个数是0个
record = ['Dave', 'Dave@gmail.com', '027-83912629', '027-91820129']
name, email, *phones = record
print(name, email, phones)

# *也可以放在前部。如查看 前6个月金额avg和当前月的比较
*before, current = [10, 8, 7, 9, 6]
avg1 = sum(before)/len(before)
print('前6个月的平均值:{},当前月值为:{}, 占比是:{}'.format(avg1, current, avg1/current)) 

3. 查找集合中最大/最小的N个元素-heap

heap模块的nlargest(), nsmallest()

import heapq

nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 47, 2]
print(heapq.nlargest(3, nums))
print(heapq.nsmallest(3, nums))

# 字典呢
portfolio = [ 
    {'name': 'IBM', 'shares': 100, 'price': 91.1}, 
    {'name': 'AAPL', 'shares': 50, 'price': 543.22}, 
    {'name': 'FB', 'shares': 200, 'price': 21.09}, 
    {'name': 'HPQ', 'shares': 35, 'price': 31.75}, 
    {'name': 'YHOO', 'shares': 45, 'price': 16.35}, 
    {'name': 'ACME', 'shares': 75, 'price': 115.65} 
]
print('\n 字典')
# 接受关键字参数,用到字典中
print(heapq.nlargest(3, portfolio, key=lambda s:s['price']))

 heapq,底层实现里会将集合数据进行堆排序会放入一个列表
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 47, 2]
import heapq
heapq.heapify(nums)
# 堆数据结构的最重要的特征:heap[0] 永远是最小的元素
print('\n经过堆排序后的结果集:', nums)
# 适用场景:
#1、查找极值数量较少 则宜用 nlargest(), nsmallest()
#2、仅仅求极值进,max(), min()
#3、返回有序集接近源集合大小时, 则用切片和sorted(),如sorted(items[:N]) 或 sorted(items[-N:])

4. 处理字典中的多值映射的两种方式-defaultdict()

defaultdict 类, 只需要关注元素的添加操作

from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)
#输出: defaultdict(list, {'a': [1, 2], 'b': [4]})
d_s = defaultdict(set)
d_s['a'].add(1)
d_s['a'].add(2)
d_s['b'].add(4)
#输出: defaultdict(set, {'a': {1, 2}, 'b': {4}})
# 常规写法,复杂
d = {} 
for key, value in pairs: 
    if key not in d: 
        d[key] = [] 
    d[key].append(value)

5. 排序字典的键值对元素-OreredDict

向字典中添加键值对时,元素是无序存储的。collections 模块的 OrderedDict类可以改变这种默认规则

from collections import OrderedDict

def ordered_dict():
    d=OrderedDict()
    d['foo'] = 1 
    d['bar'] = 2 
    d['spam'] = 3 
    d['grok'] = 4
    for key in d:
        print(key, d[key])

ordered_dict()
# OrderedDict类 内部维护着一个根据键插入顺序排序 的双向链表,大小是普通字典的两倍
# 构建一个将来需要序列化 或编码成其它格式的映射时,非常有用
d['foo'] = 1 
d['bar'] = 2 
d['spam'] = 3 
d['grok'] = 4
import json
json.dumps(d)

6. 查找字典的相同点

a = { 'x' : 1, 'y' : 2, 'z' : 3 }
b = { 'w' : 10, 'x' : 11, 'y' : 2 }
print(a.keys() & b.keys() )
print(a.keys() - b.keys() )
print('(键-值)元素对:',a.items() & b.items()) 
# 用来构造排除了指定键的新字典
c = {key:a[key] for key in a.keys() - {'z', 'w'}}
print(c)

7. 命名切片-slice()

利用slice()来命名切片,提高可读性高。

record = '....................100 .......513.25 ..........'
SHARES = slice(20, 23) 
PRICE = slice(31, 37) 
cost = int(record[SHARES]) * float(record[PRICE])

8. 计算序列中出现次数最多的元素-Counter

collections.Counter

words = [ 'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes', 'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the', 'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into', 'my', 'eyes', "you're", 'under' ] 
from collections import Counter 
word_counts = Counter(words) # 出现频率最高的 3 个单词 
top_three = word_counts.most_common(3) 
print(top_three)

9. 按关键字排序字典列表-itemgetter()

itemgetter.itemgetter()
 
rows = [ {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, 
        {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, 
        {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}, 
        {'fname': 'Big', 'lname': 'Jones', 'uid': 1004} ]

from operator import itemgetter 
rows_by_fname = sorted(rows, key=itemgetter('fname')) 
rows_by_uid = sorted(rows, key=itemgetter('uid')) 
print(rows_by_fname) 
print(rows_by_uid)
# 对两个列排序 
rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))

# 通过lambda表达式  
rows_by_lfname = sorted(rows, key=lambda r: (r['lname'],r['fname']))
                        
print(rows_by_lfname)

10. 提取字典中的子集

prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75 }
# 字典推导
p1 = {key: value for key, value in prices.items() if value > 200}

# 较慢1.6倍的操作
tech_names = { 'AAPL', 'IBM', 'HPQ', 'MSFT' } 
p2 = { key:prices[key] 
      for key in prices.keys() & tech_names } 

11. 合并字典-update()

a = {'x': 1, 'z': 3 } 
b = {'y': 2, 'z': 4 }
from collections import ChainMap 
c = ChainMap(a, b)
print(c)
# 修改源字典,结果字典也会跟着变化 
a['x'] = 42
print('修改源字典值后, 结果会跟着改变:', c)

# 使用 update() 方法,则不会改变。因为是创建的一个新对象
a = {'x': 1, 'z': 3 } 
b = {'y': 2, 'z': 4 }
merged=dict(b)
merged.update(a)
print('udpate()之前的字典为:', merged)
a['x'] = 39
print('修改源字典后,update()的对象并没有改变:', merged)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

L15-Python cookbook 数据结构与算法练习题 的相关文章

随机推荐

  • PROC系列之---/proc/pid/statm

    proc statm 包含了所有CPU活跃的信息 xff0c 该文件中的所有值都是从系统启动开始累计到当前时刻 root 64 localhost cat proc self statm 654 57 44 0 0 334 0 输出解释 C
  • Linux下使用socket传输文件的C语言简单实现

    简单的C语言实现 xff0c 客户端通过TCP协议向服务器端请求传输的文件 xff0c 服务器端收到请求后向客户端发送文件 服务器程序和客户端程序应当分别运行在两台计算机上 在运行服务器端的计算机终端执行 xff1a file server
  • 设置linux进程优先级和CPU亲和性(转载)

    进程cpu资源分配就是指进程的优先权 xff08 priority xff09 优先权高的进程有优先执行权利 配置进程优先权对多任务环境的linux很有用 xff0c 可以改善系统性能 还可以把进程运行到指定的CPU上 xff0c 这样一来
  • 20130718:Linux内核编译

    最近在学习 操作系统概念 一书 xff0c 有些实验需要在系统内核中增加一些新的系统调用 xff0c 由此便产生了修改内核源码并重新编译生成新内核的需求 我的思路是 首先搞定内核编译的流程 xff0c 确保有个可用的实验环境 xff0c 在
  • Linux Bash Shell 学习笔记

    1 bash脚本的参数处理 BASH的参数可以用 加数字编号来访问 xff0c 其中 xff1a 代表脚本的参数个数 1代表脚本的第1个参数 2代表脚本的第2个参数 以此类推 xff0c n代表脚本的第n个参数 xff0c 但是 xff0c
  • L1-python中的特殊方法__str__

    1 使用场景 在Python的类的定义中 xff0c init 方法用来初始化实例属性 当创建类对象并打印输出时 xff0c 默认输出结果会是一串地址符 xff0c 如 xff1a lt main Student object at 0x0
  • L3-python语言中的几种特征操作

    汇总了目前碰到的几个Python有别于其它程序语言特征 xff0c 体现了Python语言自有的简洁与优雅 xff0c 可参考如下使用与注意事项 列表推导式 一行代码直接对列表元素进行翻倍操作 xff0c 比for的遍历 xff0c 简洁
  • 7-13 统计工龄 (20 分)

    给定公司N名员工的工龄 xff0c 要求按工龄增序输出每个工龄段有多少员工 输入格式 输入首先给出正整数N xff08 10 5 xff09 xff0c 即员工总人数 xff1b 随后给出N个整数 xff0c 即每个员工的工龄 xff0c
  • L4-深度分析Python数据库(SQLServer)访问中的连接

    1 环境准备 首先就是要安装包 xff0c 直接使用pip命令安装即可 pip install pymssql 2 Python pymssql库的数据库访问分析 参考下图 xff0c 描述了数据库连接在单次访问中的创建与关闭 值得注意的是
  • L5-利用Python生成器巧解算法小题

    介绍两个利用Python生成器替代传统的循环遍历操作来解决问题的例子 经过思考与实践 xff0c 充分利用这种自有特征 xff0c 理解实现的细节 xff0c 感受这种编程方式的优雅 1 字符替换 将 aeiou 进行替换 xff0c 规则
  • L6-Numpy中的随机函数

    文章目录 1 rand 2 randn 3 randint 4 random 5 choice 6 随机种子seed 本文汇总了Numpy中常见的取随机数的函数 xff0c 介绍了基本用法 1 rand 指定的输出的二维数组的型 xff0c
  • L7-Python字符串格式化小结

    文章目录 一 百分号 1 直接使用2 表达式赋值3 绑定变量名4 格式符汇总说明5 更精细化的控制 二 format控制基本语法1 绑定变量名2 绑定对象属性3 通过下标取元素来赋值4 填充与对齐5 精度与类型6 千位分隔符 本篇汇总了Py
  • L8-Flatten拍平多维数组的元素

    文章目录 案例说明1 最平凡 xff1a 数组索引访问2 最伤脑 xff1a 二次遍历 列表生成器3 最灵巧 xff1a 活用函数sum 为什么sum 还可以这样玩 xff1f 4 最省心 xff1a 一步到位 xff0c Numpy fl
  • L9-Python内部变量的作用域问题

    文章目录 写在开头一 连续等式判断二 函数内部变量作用域的变更1 对外部变量不进行运算 xff0c 直接访问2 直接对外部变量进行操作运算3 新增global声明 xff0c 再操作 写在开头 分享 记录两个有意思的案例 xff0c 平时碰
  • L10-简谈正则表达式中几个函数的使用

    文章目录 概述1 match 2 search 3 sub 4 compile 5 findall 6 finditer 7 split 8 subn 9 groups 10 贪婪模式与惰性模式注意事项 概述 正则表达式本身是一种小型的 高
  • L11-Python中的高阶函数的使用

    Python中的函数是一个对象 xff0c 既可以作为输入参数 xff0c 也可以作为返回结果 在这里聊聊几个常用的高阶函数 xff0c 来看看函数是如何被作为输入参数 返回结果来使用的 1 map 映射函数 语法 xff1a map fu
  • L12-聊聊Python的装饰器

    文章目录 1 基本介绍2 理解函数2 1 函数也是对象2 2 嵌套函数2 3 返回结果为函数2 4 函数作为输入参数 3 创建装饰器4 带参数的装饰器5 装饰器的应用 监控日志 1 基本介绍 定义 在函数调用前后自动打印日志 xff0c 称
  • L13-理解Python中的特殊的返回值-函数

    文章目录 说明1 初识返回值 函数2 辨识函数对象3 闭包的注意事项谨记如何避免 xff1f 说明 在Python中 xff0c 一切函数即对象 函数同时也可视作变量 xff0c 作为一个返回值 下面通过实际案例来说明下 xff0c 当函数
  • c语言将两个递增的顺序表合并为一个递减的顺序表

    eg xff1a 顺序表A xff1a 1 3 5 7 顺序表B xff1a 2 4 6 8 合并后的表C xff1a 8 7 6 5 4 3 2 1 思路 xff1a 从后往前遍历顺序表A和B xff0c 如果当前A表的数大于等于B表的数
  • L15-Python cookbook 数据结构与算法练习题

    文章目录 1 解压赋值给多个变量2 解压可迭代对象赋值给多个变量3 查找集合中最大 最小的N个元素 heap4 处理字典中的多值映射的两种方式 defaultdict 5 排序字典的键值对元素 OreredDict6 查找字典的相同点7 命