鱼C论坛

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

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

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

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

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

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

1.将包含N个元素的可迭代对象解压后同时赋值给N个变量。
例如:
  1. p=[4,5]
  2. x,y=p
  3. list=['abc',1,10,(1,2,3)]
  4. str1,num1,num2,tuple1=list
复制代码

注:可迭代对象可以是列表、元组、字符串、文件对象、迭代器、生成器等。
        变量的个数要与序列中的元素相匹配
例如:
  1. data=['小明','175','65',(1995,10,15)]
  2. name,height,weight,(year,mon,day)=data
复制代码

与上例中的list的解压不同的是,我们可以把列表中的元组元素进一步解压成3个变量(要用括号把3个变量括起来)。
例如:解压一个列表中的单个字符串元素要加上一个逗号
  1. data=['12']
  2. [x,y],=data
复制代码
  1. [x,y]=data
复制代码

没有逗号将报错Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
  1. [x,y]=data
  2. ValueError: not enough values to unpack (expected 2, got 1)
  3. (x,y),=data
复制代码

解压字符串如下
  1. a,b,c='123'
复制代码

结果为a='1',b=2',c='3'。

2.当只解压一部分,丢弃其他部分的时候,可以用任意变量去占位,然后在丢掉不用的变量。如下例中的"_"作为占位变量。
  1. data=['xiaoming',175,130,(1999,4,5)]
  2. name,_,weight,_=data
复制代码

结果为name=‘xiaoming’,weight=130,_的值为最后的赋值(1999,4,5)。
3.当我们需要将几个元素解压给同一个变量的时候,可以用*变量名,这样变量既可以接收多个元素。
  1. data=[1,a,b,c,'nihao']
  2. n,*alp,st=data
复制代码

这里alp的值将是个序列,结果n=1,alp=['1', '2', '3'],st=‘nihao’。
  1. students=[('a',100,99),('b',70,80),('c',60,88)]
  2. def grade(x,y):
  3.         print(x,y)       
  4. for name,*xy in students:
  5.         if name=='b':
  6.             grade(*xy)
  7.         elif name=='a':
  8.             grade(*xy)
  9.         else:
  10.             grade(*xy)
复制代码

*解压也可像上面的例子用于解压带标签元组里的元素。结果为
100 99
70 80
60 88
4.当我们在搜索某些关键字并且返回其前N行的时候可用双端队列“deque”来实现
  1. from collections  import deque

  2. def search(lines,pattern,history):
  3.     previous_lines=deque(maxlen=history)
  4.     for li in lines:
  5.         if pattern in li:
  6.             yield li ,previous_lines
  7.         previous_lines.append(li)
  8.         
  9. if __name__=='__main__' :
  10.     with open(r"C:\Users\Administrator\Desktop\游戏资料.txt") as f:
  11.         for line ,prevlines in search(f,"62524",5):
  12.             for pline in prevlines:
  13.                 print(pline,end="\n ")
  14.             print(line,end='\n ')
  15.             print("-"*20)
  16.    
复制代码

代码中“yeild“,每次循环返回的迭代的生成器,可以用循环来生成值,
deque的maxlen指的是其序列包含的元素个数不能超过其值,当超过时就会弹出最老的元素
5.从一个集合里返回N个最大或最小的元素
  1. import heapq
  2. nums=[1,8,2,23,7,-4,23,42,37,]
  3. print(heapq.nlargest(3,nums))
  4. print(heapq.nsmallest(3,nums))
复制代码

结果:[42, 37, 23]
           [-4, 1, 2]
nlargest/nsmallest(n,list),表示返回n个最大值或最小值
这两个函数中都可以使用key关键字来排序
  1. import heapq
  2. students=[
  3.     {'name':'xiaoming','language':98,'math':88},
  4.     {'name':'xiaohong','language':78,'math':76},
  5.     {'name':'xiaozhang','language':90,'math':78},
  6.     {'name':'xiaosong','language':85,'math':80},
  7.     {'name':'xiaowang','language':87,'math':100},
  8.     ]
  9. student_math=heapq.nlargest (4,students,key=lambda s:s['math'])
  10. 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}]
  1. import heapq
  2. nums=[1,8,2,23,7,-4,23,42,37,]
  3. heapq.heapify(nums)#将nums转化成堆
  4. print(heapq.heappop(nums))#弹出堆中的最小值
  5. 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-4-23 19:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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