实例案例:
- 过滤掉列表
[3,9,-1...]
中的负数,
这里要注意:不管你是为了python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!
解决方案: 列表解析[x for x in data if x >=0]
l=[randint(-10,10) for _in range(10)] [x for x in l if x>=0] g=filter(lambda x:x>=0,l) next(g) list(g) 复制代码
实例案例:
- 筛出字典
{'lilei':79,'jim':88,'lucy':92...}
中值高于90的项
解决方案: 字典解析 {k:v for k,v in d.items() if v >90}
d={'student%d' % i:randint(50,100) for i in range(1,21)} {k:v for k,v in d.items if v>=90} g=filter(lambda item:item[1]>=90,d.items()) list(g) dict(g) 复制代码
实例案例:
- 筛出集合
{77,89,32,20...}
中能被3整除的元素 -
解决方案: 列表解析
[x for x in data if x % 3==0]
s={randint(0,20) for _ in range(20)} {x for x in s if x % 3==0} 复制代码
2. 如何为元组中的每个元素命名提高程序的可读性
实例案例:
学生系统中数据为固定格式:(名字,年龄,性别,邮箱)
('jim',16''male','jim8721@gmail.com')
('lilei',17''male','leilei@qq.com')
('lucy',16''female','lucy123@yahoo.com')
访问时我们使用索(index)访问,大量索引降低程序可读性.
解决方案:
方案1:定义一系列数值常量或枚举类型
方案2: 使用标准库中collections.namedtuple
替代内置tuple
from enum import intenum name,age,sex,email=range(4) s=('jim',16''male','jim8721@gmail.com') class studentenum(intenum): name=0 age=1 sex=2 email=3 studentenum.name s[studentenum.name] isinstance(studentenum.name,int) 复制代码
解决方案2:
from collections import namedtuple student=namedtuple('student',['name','age','sex','email']) s2=student('jim',16''male','jim8721@gmail.com') s2 student(name='jim',age=16,sex='male',email='jim8721@gmail.com') isinstance(s2,tuple) 复制代码
3.如何根据字典中值得大小,对字典中的项排序
实例案例:
某班英语成绩以字典形式存储为:
{ 'lilei':79, 'jim' :88, 'lucy' :92, .. } 复制代码
如何根据成绩高低,计算学生排名
解决方案:将字典中的各项转换为元组,使用内置函数sorted排序
方案1:将字典中的项转化为(值,键)元组.(列表解析或zip)
from random import randint d={k:randint(60,100) for k in 'abcdefg'} l=[(v,k) for k in d.items()] sorted(l,reverse=true) d.items() p=sorted(d.items(),key=lambda item:item[1],reverse=true) list(enumerate(p)) list(enumerate(p,1)) for i (k,v) item in enumerate(p,1): print(i,k,v) d[k]=(i,v) 字典解析:{k:(i,v) for i (k,v) item in enumerate(p,1)} 复制代码
4.如何统计序列中元素出现的频度
实例案例:
1.某随机序列[12,5,6,4,6,5,5,7]
中,找到出现次数最高的3个元素,它们出现次数是多少?
2.对于某英文文章,进行词频统计,找到出现次数最高的10个单词,他们出现次数是多少?
解决方案:
方案1.将序列转换成字典{元素:频度},根据字典中的值排序。
from random import randint data=[randint(0,20) for _ in range(30)] d=dict.fromkeys(data,0) for x in data: d[x] +=1 sorted(((v,k) for k, v in d.items()),reverse=true)[:3] import heapq heapq.nlargest(3,(v,k) for k,v in d.items) 复制代码
方案2:使用标准库collections
中的counter
对象
from collections import counter data c=counter(data) c.most_common(3) txt=open('example.txt').read() import re word_list=re.split('\w+',txt) c2=counter(word_list) c2.most_common(10) 复制代码
5.如何快速找到多个字典中的公共键
实例案例:
西班牙足球联赛,每轮队员进球统计:
第1轮:{'苏亚雷斯':1,'梅西':2,'本泽马':1,...}
第1轮:{'苏亚雷斯':2,'c罗':1,'格里斯曼':2,...}
第1轮:{'苏亚雷斯':1,'托雷斯':2,'贝尔':1,...}
统计出前n轮每场比赛都有进球的球员.
解决方案:
方案1.
from random import randint,simple simple('abcdefgh',3) simple('abcdefgh',randint(3,6)) d1={k:randint(1,4) for k in sample('abcdefgh',randint(3,6))} d1 d2={k:randint(1,4) for k in sample('abcdefgh',randint(3,6))} d3={k:randint(1,4) for k in sample('abcdefgh',randint(3,6))} for k in d1: if k in d2 and k in d3: print(k) [k for k in d1 if k in d2 and k in d3] d1=[d1,d2,d3] [k for k in d1[0] if all(map(lambda d: k in d,d1[1:]))] 复制代码
解决方案:
利用集合(set)的交集操作 step1:使用字典的keys()方法,得到一个keys的集合 step2:使用map函数,得到每个字典的keys的集合 step3:使用reduce函数,取所有字典的keys集合的交集
s1=d1.keys() s2=d2.keys() s1 & s2 from functools import reduce reduce(lambda a,b:a*b,range(1,11)) map(dict.keys,d1) reduce(lambda a,b:a&b map(dict.keys,d1) 复制代码
6.如何让字典保持有序
实例案例:
某编程比赛系统, 对参赛选手编程解题进行计时,选手晚上比赛后,把该选手解题用时记录到字典中,以便赛后按选手名查询成绩. {'lilei':(2,43),'hanmeimei':(5,52),'jim':(1,39)...}
比赛结束后,需按排名顺序依次打印选手成绩,如何实现?
解决方案:
使用标准库collection
中的ordereddict
以ordereddict替代内置字典dict,依次将选手成绩存入ordereddict
d={} from collections import orderddict od = ordereddict() od=['c'] od=['b'] od=['a'] od.keys() players = list('abcdefgh') from random import shuffle shuffle(players) players od=ordereddict() for i, p in enumerate(players,1) od[p] = i0 od def query_by_name(d,name): return d[name] query_by_name(od,'c') 复制代码
7.如何实现用户的历史记录功能
研讨问题:
如何实现用户的历史记录功能(最多n条)?
实例案例:
很多应用程序都有浏览用户的历史记录功能,例如:
1.浏览器可以查看最近浏览的网页
2.视频播放器可以查看最近播放过的视频文件
3.shell可以查看用户输入过的命令
现在我们制作了一个简单的猜数字游戏 如何添加历史记录,显示用户最近猜过的数字?
from random import randint def guess(n,k): if n ==k: print('猜对了,这个数字是%d.' %k) return true if n<k: print('猜大了,比%d小.' %k) elif n>k: print('猜小了,比%d大。'%k) return false def main(): n = randint(1,100) i =1 while true: line= input('[%d] 请输入一个数字:' %d) if line.isdight(): k = int(line) i += 1 if guess(n,k): break elif line == 'quit': break if __name__=='__main__': main() 复制代码
解决方案:
使用容量为n的队列存储历史记录 使用标准数据库collections
中的deque
,它是一个双端队列 使用pickle模块将历史记录存储到硬盘,以便下次启动使用
from collections import deque deque([],5) q.append(1) q.append(2) q.append(3) q.append(4) q.append(5) q deque([1,2,3,4,5],maxlen=5) q.append(6) q deque([2,3,4,5,6],maxlen=5) from random import randint from collections import deque def guess(n,k): if n ==k: print('猜对了,这个数字是%d.' %k) return true if n<k: print('猜大了,比%d小.' %k) elif n>k: print('猜小了,比%d大。'%k) return false def main(): n = randint(1,100) i =1 hq=deque([],5) while true: line= input('[%d] 请输入一个数字:' %d) if line.isdight(): k = int(line) hq.append(k) i += 1 if guess(n,k): break elif line == 'quit': break elif line=='h?' print(list(hq)) if __name__=='__main__': main() import pickle pickle.dump q deque([2,3,4,5,6],maxlen=5) pickle.dump(q,open('save.pkl','wb')) ed save.pkl q2=pickle.load(open('save.pk1','rb')) 复制代码
本文讲解了列表,字典集合根据条件筛选数据,根据字典的值得大小进行排序,统计序列中出现元素的频度,如何实现用户的历史记录功能。
最后注意:不管你是为了python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。