python-cookbook

本文介绍了Python数据结构和算法的实用技巧,包括使用Heapq实现优先级队列,字典的各种操作如多值字典、排序,collections模块的功能如保留最近元素、频率统计,以及解压赋值、去重保持顺序等其他操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PYTHON-COOKBOOK

一:数据结构和算法

三个基本的写法:

  1. 列表生成式
  2. 字典生成式
  3. 迭代器生成式

1、Heapq

取出最大或最小的几个元素
# 最大或者最小的n个元素

import random
from heapq import nsmallest,nlargest

tt = [random.randint(1,10000) for i in range(1000)]

# 取出的元素较少
%time nsmallest(7,tt)
%time nlargest(7,tt)

# 取出的元素很多
%time sorted(tt)[:7]
%time sorted(tt)[-7:]

# 只取出最大的或者最小的
%time min(tt)
%time max(tt)
优先级队列
import heapq

class PriorityQueue:
    def __init__(self):
        self._queue = []
    def push(self,item,priority):
        heapq.heappush(self._queue,(priority,item))
    def pop(self):
        r = heapq.heappop(self._queue)
        return r 

pp = PriorityQueue()
pp.push('a',3)
pp.push('b',9)
pp.push('c',6)
pp.push('d',3)

for i in range(4):
    print(pp.pop())

2、字典

多值字典
from collections import defaultdict

d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)

# dd = defaultdict(tuple)
字典排序
# 字典排序
shares = {
    'ACME': 45.23,
    'AAPL': 612.78,
    'IBM': 205.55,
    'HPQ': 37.20,
    'FB': 10.75
}
rev_shares = list(zip(shares.values(),shares.keys()))

print(min(rev_shares))
print(max(rev_shares))
print(sorted(rev_shares))
字典列表排序
# 字典列表的排序
from operator import itemgetter
aa = [
    {'name':'bob','score':10},
    {'name':'ming','score':12},
    {'name':'mike','score':1}
]
    
sorted(aa,key=itemgetter('score'))
字典共同点和不同点
# 字典的共同点 和 不同点
a = {'x': 1, 'y': 2, 'z': 3}
b = {'w': 10, 'x': 11, 'y': 2}
print(a.keys() & b.keys())
print(a.keys() - b.keys())

3、collections

保留最后几个元素
# 保留最后几个元素
from collections import deque

def lastN(ll):
    dq = deque(maxlen=3)
    for i in ll:
        # yield i
        dq.append(i)
    return dq
    
aa =  [1,2,67,4,3,6,87,4]
lastN(aa)
频率统计
# 统计出现频率
import random
from collections import Counter

aa = [random.randint(1,10) for x in range(30)]
res = Counter(aa)

print(res)
print(res.most_common(3))
命名元组
# 命名元组
from collections import namedtuple

sub = namedtuple('sub',['name','score'])
s = sub('bob','87')

print(s.name)
print(s.score)
字典(映射)联合查找
from collections import ChainMap

a = {'x': 1, 'z': 3 }
b = {'y': 2, 'z': 4 }
c = {'d': 5, 'z': 9 }

md = ChainMap(a,b,c)

print(md.get('x'))
print(md.get('z'))
print(md.get('yzz'))

4、其他

解压赋值
# 解压赋值
record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
name,_,*phone = record
print(name)
print(phone)
去重且保持顺序
# 去重并且保持顺序

def dedupe(ll):
    seen = set()
    for item in ll:
        if item not in seen:
            yield item 
            seen.add(item)
    return seen 

a = [1,2,56,7,4,8,32,8,4,76,8,43,3]
print(list(dedupe(a)))
切片
# 切片命名

a = '----80-34--------8000---'
b = '----60-22--------7867---'

iid = slice(4,6)
age = slice(7,9)
salary = slice(17,21)

print(a[iid])
print(b[salary])
分组
# 分组
from operator import itemgetter
from itertools import groupby

rows = [
    {'address': '5412 N CLARK', 'date': '07/01/2012'},
    {'address': '5148 N CLARK', 'date': '07/04/2012'},
    {'address': '5800 E 58TH', 'date': '07/02/2012'},
    {'address': '2122 N CLARK', 'date': '07/03/2012'},
    {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
    {'address': '1060 W ADDISON', 'date': '07/02/2012'},
    {'address': '4801 N BROADWAY', 'date': '07/01/2012'},
    {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]

rows.sort(key=itemgetter('date'))
for date,items in groupby(rows,itemgetter('date')):
    print(date)
    for i in items:
        print(i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值