python实用小技之数据结构

目录

  • 1.解压序列赋值给多个变量
  • 2.解压可迭代对象赋值给多个变量
  • 3.保留有限的历史记录
  • 4.怎样从一个集合中获得最大或者最小的 N 个元素列表?
  • 5.字典排序
  • 6.字典中的键映射多个值
  • 7.字典的运算(求最小值、最大值、排序等)

本文大多数例子搬自 python cookbook 这里是对学习的一个总结和提炼

ps:python版本为python3

1.解压序列赋值给多个变量

# 有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?
data = [‘ACME‘, 50, 91.1, (2012, 12, 21)]
# 任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量
# 变量的数量必须跟序列元素的数量是一样的
name, shares, prices, date = data
print(name, shares, prices, date, sep=" | ", end="\n")
# 如果只需要一部分,可以给个占位变量如
_, sha, pr, _ = data
print(sha,pr,sep=‘ | ‘)
运行结果:
ACME | 50 | 91.1 | (2012, 12, 21)
50 | 91.1

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

# 解压可迭代对象赋值给多个变量
def drop_frist_last(grades):
    frist, *middle, last = grades
    return sum(middle) / len(middle)
print(drop_frist_last([0, 60, 70, 80, 100]))

# 有时候,你想解压一些元素后丢弃它们,可以使用 比如 _ 或者 ign
record = (‘ACME‘, 50, 123.45, (12, 18, 2012))
name,*_,(*_,year) = record
print(name,year)
运行结果:
70.0
ACME 2012

3.保留有限的历史记录

‘‘‘
使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉
‘‘‘
def search(lines, pattern, histroy=60):
    previous_lines = deque(maxlen=histroy)
    for line in lines:
        if pattern in line:
            yield line, previous_lines
            previous_lines.append(line)
            print(len(previous_lines))
            for item in previous_lines:
                print(item)

if __name__ == "__main__":
    with open(os.getcwd() + "/Lesson1.py") as f:
        for line, prevlines in search(f, ‘50‘, 3):
            print("type prevlines =", type(prevlines))
            for pline in prevlines:
                print(‘pline = ‘, pline, end=‘‘)
            print("type line =", type(line))
            # print(‘line = ‘, line, end=‘‘)
            print(‘-‘ * 20)
#

4.怎样从一个集合中获得最大或者最小的 N 个元素列表?

# 当集合是一个列表是
nums = [3, 10, 5, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3, nums))
print(heapq.nsmallest(3, nums))
# 如果是更负责的对象时候
mydirt = [
    {‘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}]
print(heapq.nlargest(2, mydirt, key=lambda l: l[‘price‘]))
print(heapq.nsmallest(2, mydirt, key=lambda l: l[‘price‘]))
运行结果
[42, 37, 23]
[-4, 2, 3]
[{‘name‘: ‘AAPL‘, ‘shares‘: 50, ‘price‘: 543.22}, {‘name‘: ‘IBM‘, ‘shares‘: 100, ‘price‘: 91.1}]
[{‘name‘: ‘FB‘, ‘shares‘: 200, ‘price‘: 21.09}, {‘name‘: ‘HPQ‘, ‘shares‘: 35, ‘price‘: 31.75}]

ps:堆数据结构最重要的特征是 heap[0] 永远是最小的元素,另外 nlargest,nsmallest 适合查找的元素个数相对比较小的时候,如果你仅仅想查找唯一的最小或最大(N=1)的元素的话,那么使用 min() 和 max() 函数会更快些。 类似的,如果 N 的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点 ( sorted(items)[:N] 或者是 sorted(items)[-N:] )

5.字典排序

‘‘‘
你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。
‘‘‘
from collections import OrderedDict

d = OrderedDict()
d[‘foo‘] = 1
d[‘beer‘] = 2
d[‘bar‘] = 4
d[‘park‘] = 3
for key in d:
    print(key, d[key])

执行结果:
foo 1
beer 2
bar 4
park 3

6.字典中的键映射多个值

from collections import defaultdict

df_d = defaultdict(list)
df_d[‘a‘].append(1)
df_d[‘a‘].append(2)
df_d[‘b‘].append(4)
print(df_d)

d2 = defaultdict(set)
pairs = [(‘a‘, 1), (‘a‘, 2), (‘b‘, 4)]
for key, value in pairs:
    d2[key].add(value)
print(d2)

运行结果:
defaultdict(<class ‘list‘>, {‘a‘: [1, 2], ‘b‘: [4]})
defaultdict(<class ‘set‘>, {‘a‘: {1, 2}, ‘b‘: {4}})

7.字典的运算(求最小值、最大值、排序等)

怎样在数据字典中执行一些计算操作(比如求最小值、最大值、排序等等)?

prices = {
    ‘ACME‘: 45.23,
    ‘AAPL‘: 612.78,
    ‘IBM‘: 205.55,
    ‘HPQ‘: 37.20,
    ‘FB‘: 10.75
}

# 求最小值
# 方法 1,通过zip 函数创建的是一个只能访问一次的迭代,将键值反过来
print(min(zip(prices.values(), prices.keys())))
# 输出 (10.75, ‘FB‘)

# 方法二 直接取values 获取最小值,不过你就不知道对于的key
print(min(prices.values()))
# 输出 10.75

# 方法三
min_key = min(prices, key=lambda k: prices[k])
print(prices[min_key])
# 输出 FB

# 排序
prices_sorted = sorted(zip(prices.values(), prices.keys()))
print(prices_sorted)
# 输出 [(10.75, ‘FB‘), (37.2, ‘HPQ‘), (45.23, ‘ACME‘), (205.55, ‘IBM‘), (612.78, ‘AAPL‘)]

原文地址:https://www.cnblogs.com/luoman/p/12663873.html

时间: 2024-07-30 07:31:44

python实用小技之数据结构的相关文章

python实用小技巧自问自答系列(一):查看类中函数文档doc的方法

问题:如何查看某个类的方法文档说明或者是函数的参数列表情况? 答: 方法一:直接在需要查询的方法后面加上".__doc__"即可以打印出该方法的文档说明(需要先导入该方法所属模块) 如: 方法二:在windows的命令行模式下还可以输入:"python -m pydoc 方法名"获取该方法的文档说明 如: 方法三:在ipython的命令行解释器模式下可以通过方法名+问号的方式来查看该方法的文档说明(需要先导入该方法所属模块)      如: 方法四:通过help函数

《Python绝技:运用Python成为顶级黑客》 Python实用小工具

1.实现简单探测 使用socket模块,connect()方法建立与指定IP和端口的网络连接:revc(1024)方法将读取套接字中接下来的1024B数据 mport socket import sys socket.setdefaulttimeout(2) s=socket.socket() s.connect(('192.168.1.1',21)) ans=s.recv(1024) print(ans) 通过函数实现 通过def()关键字定义,示例中定义扫描FTP banner信息的函数:

python实用一技--重命名

某宝给小朋友买了个电子琴学习光盘,想放到ipad播放,但光盘上的文件为dat格式,需转为msp格式,以下为转换代码(其实就是重命名文件): 1 #encoding=utf-8 2 """ 3 将VCD的DAT文件命令为mpg文件 4 """ 5 import os 6 path = r"E:\家庭&生产\B\MPEGAV2" 7 filelist = os.listdir(path) 8 count=0 9 def g

小猿圈之python实用的几款开发工具

随着python技术的不断发展,开发的速度,数据的处理,编辑器都有很多,真正实用的却不多见,一个好的开发工具,会大大提高开发者的速度,帮程序员解决难题,下面小猿圈加加介绍几款好用的开发工具,有的工具你是否在用呢?一起来看看吧! 作为一个python的入门者,除了掌握这么语言的基本要领外,一款好的python开发工具是必不可少的. 1.github Git是一个分布式的版本控制系统,最初由LinusTorvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤

最火Python3 玩转实用小工具

第1章 课程介绍介绍课程的主要内容,课程内容安排.1-1 最火python3玩转实用小工具课程导学. 试看 第2章 自主研发-购书比价工具首先做好知识储备,讲解JSON.xpath.requests等用法以及字符串的高级用法.然后结合所学知识逐步分析当当.淘宝.京东.1号店的数据结构,实现数据爬取,再对数据进行整合,排序,实现效果.最后对代码进行review,引入一道面试题,深入讲解python对象相关知识点....2-1 课程概要及环境搭建 试看2-2 json知识点学习 试看2-3 xpat

Python编码小技巧分享【新手必学】

本次分享了python编程小技巧总结如下,希望对大家有帮助,非常实用哦注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑.为此小编建了个Python全栈免费答疑交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,不懂的问题有老司机解决里面还有最新Python教程项目可拿,,一起相互监督共同进步! 交换值 从列表中的所有元素创建单个字符串 查询列表中出现频率最多的元素 检查两个单词是否是字谜 反转字符串 反转列表 转置 2 维数组 链式比较 链式函数调用 列表复制 字典值获

python try小例子

#!/usr/bin/python import telnetlib import socket try: tn=telnetlib.Telnet('10.67.21.29',60000) except socket.error, e: print e exit(1) tn.set_debuglevel(1) tn.write('quit'+'\n') print 'ok' socket.error为错误类型 e为对象 python try小例子,布布扣,bubuko.com

用Notepad++写python的小配置

在上一家公司的时候,写python,用的emeditor,由于是公司的电脑,都是配置好的,写python还是比较顺手,现在离开后,一直用notepad++,想转到notepad++来写python的代码,遂研究了下,配置了自己的Notepad++的python环境. 首先你要安装python.notepad++,这个去官网下载安装就行,不多赘言. 安装完基本工具后,开始配置Notepad++了. 1.点击“运行”-“运行”,弹出一个对话框,输入命令 cmd /k C:\Python27\pyth

实用小技巧1

把windows电脑变成路由器使用 适用对象: windows7.windows8的笔记本电脑或者有无线网卡的台式电脑 网络要求: CMCC-EDU和家里拨号上网的都可以,但是电信的校园有线不行 步骤如下: 1.在开始菜单里搜索cmd,找到后以管理员身份运行 2.在cmd命令行上输入以下命令: netsh wlan set hostednetwork mode=allow ssid=你所共享的无线的名字(最好是英文或者是拼音) key=密码 回车 这一步主要是设置你的“路由器” 3.下一步是开启