鱼C论坛

 找回密码
 立即注册
查看: 3767|回复: 2

[技术交流] 《Python Cookbook》第一章数据结构和算法笔记

[复制链接]
发表于 2017-6-7 23:47:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lh625243422 于 2017-6-11 14:05 编辑

1.将包含N个元素的可迭代对象解压后同时赋值给N个变量。
例如:
 p=[4,5]
 x,y=p
 list=['abc',1,10,(1,2,3)]
str1,num1,num2,tuple1=list
注:可迭代对象可以是列表、元组、字符串、文件对象、迭代器、生成器等。
        变量的个数要与序列中的元素相匹配
例如:
data=['小明','175','65',(1995,10,15)]
name,height,weight,(year,mon,day)=data
与上例中的list的解压不同的是,我们可以把列表中的元组元素进一步解压成3个变量(要用括号把3个变量括起来)。
例如:解压一个列表中的单个字符串元素要加上一个逗号
data=['12']
 [x,y],=data
 [x,y]=data
没有逗号将报错Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
[x,y]=data
ValueError: not enough values to unpack (expected 2, got 1)
 (x,y),=data
解压字符串如下
a,b,c='123'
结果为a='1',b=2',c='3'。

2.当只解压一部分,丢弃其他部分的时候,可以用任意变量去占位,然后在丢掉不用的变量。如下例中的"_"作为占位变量。
data=['xiaoming',175,130,(1999,4,5)]
 name,_,weight,_=data
结果为name=‘xiaoming’,weight=130,_的值为最后的赋值(1999,4,5)。
3.当我们需要将几个元素解压给同一个变量的时候,可以用*变量名,这样变量既可以接收多个元素。
data=[1,a,b,c,'nihao']
n,*alp,st=data
这里alp的值将是个序列,结果n=1,alp=['1', '2', '3'],st=‘nihao’。
students=[('a',100,99),('b',70,80),('c',60,88)]
def grade(x,y):
        print(x,y)        
for name,*xy in students:
        if name=='b':
            grade(*xy)
        elif name=='a':
            grade(*xy)
        else:
            grade(*xy)
*解压也可像上面的例子用于解压带标签元组里的元素。结果为
100 99
70 80
60 88
4.当我们在搜索某些关键字并且返回其前N行的时候可用双端队列“deque”来实现
from collections  import deque

def search(lines,pattern,history):
    previous_lines=deque(maxlen=history)
    for li in lines:
        if pattern in li:
            yield li ,previous_lines
        previous_lines.append(li)
        
if __name__=='__main__' :
    with open(r"C:\Users\Administrator\Desktop\游戏资料.txt") as f:
        for line ,prevlines in search(f,"62524",5):
            for pline in prevlines:
                print(pline,end="\n ")
            print(line,end='\n ')
            print("-"*20)
    
代码中“yeild“,每次循环返回的迭代的生成器,可以用循环来生成值,
deque的maxlen指的是其序列包含的元素个数不能超过其值,当超过时就会弹出最老的元素
5.从一个集合里返回N个最大或最小的元素
import heapq
nums=[1,8,2,23,7,-4,23,42,37,]
print(heapq.nlargest(3,nums))
print(heapq.nsmallest(3,nums))
结果:[42, 37, 23]
           [-4, 1, 2]
nlargest/nsmallest(n,list),表示返回n个最大值或最小值
这两个函数中都可以使用key关键字来排序
import heapq
students=[
    {'name':'xiaoming','language':98,'math':88},
    {'name':'xiaohong','language':78,'math':76},
    {'name':'xiaozhang','language':90,'math':78},
    {'name':'xiaosong','language':85,'math':80},
    {'name':'xiaowang','language':87,'math':100},
    ]
student_math=heapq.nlargest (4,students,key=lambda s:s['math'])
print(student_math)
结果:
[{'name': 'xiaowang', 'language': 87, 'math': 100},
{'name': 'xiaoming', 'language': 98, 'math': 88},
{'name': 'xiaosong', 'language': 85, 'math': 80},
{'name': 'xiaozhang', 'language': 90, 'math': 78}]
import heapq
nums=[1,8,2,23,7,-4,23,42,37,]
heapq.heapify(nums)#将nums转化成堆
print(heapq.heappop(nums))#弹出堆中的最小值
print(heapq.heappop(nums)#弹出堆中的最小值
结果为-4,1.

评分

参与人数 2鱼币 +11 收起 理由
康小泡 + 5
小甲鱼 + 6 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-28 11:51:59 | 显示全部楼层
好文章
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-29 18:13:45 From FishC Mobile | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 04:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表