python高级编程---数据结构
2018-03-19 00:07
357 查看
摘要:本文主要介绍python3中list、set、tuple、dict等类型数据的筛选查找。
注意:
筛选字典{‘X’:90, ‘H’:87, ‘S’:92}中值高于90的项
注意:
d.items()得到字典的键与值
d.keys()得到字典的键
d.values()得到字典的值
筛选集合{71,56,90,89,64}中能被3整除的元素
(元素存储空间小,访问速度快,但是可读性差)
解决方法:
对某英文文章的单词,进行词频统计,找到出现次数最高的10个单词,他们出现的次数是多少?
解决方法
解决方法
第二轮:{‘sun’:1,’jun’:3,’kk’:2} 统计出前N轮,每场比赛都进球的球员
解决方法:
注意:在python3中,reduce函数被封装在functools模块中
{‘lele’:(2,43),’sun’,(5,63),’jun’:(1,35)} 比赛结束后,需按排名依次打印选手成绩,如何实现?
解决办法
现在制作一个简单的猜数字的小游戏,添加历史记录功能,显示用户最近猜过的数字,如何实现?
解决办法:
1.如何在列表、字典及集合中根据条件筛选数据
过滤掉列表[3,9,1,-7,5,-3,-2]中的负数
# 方法1--for遍历 from random import randint data=[randint(-10,10) for _ in range(10)] l1=[] for i in data: if i<0: l1.append(i) print(l1) # 方法2--列表解析 l2=[x for x in data if x<0] print(l2) #方法3--filter函数 l3=list(filter(lambda x:x>0,data)) print(l3)
注意:
# 时间测试---列表解析最快 timeit l2=[x for x in data if x<0] # 1.06 µs ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) timeit l3=list(filter(lambda x:x>0,data)) #2.57 µs ± 101 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
筛选字典{‘X’:90, ‘H’:87, ‘S’:92}中值高于90的项
方法1--for遍历 from random import randint d={x : randint(60,100) for x in range(1,21)} for v in d.values(): if v>90: print(v) #方法2--字典解析 {k:v for k,v in d.items() if v>90}
注意:
d.items()得到字典的键与值
d.keys()得到字典的键
d.values()得到字典的值
筛选集合{71,56,90,89,64}中能被3整除的元素
#方法1--for遍历 from random import sample s=set(sample(range(10),5)) for i in s: if i%3==0: print(i,end=' ') print() #方法2--集合解析 {x for x in s if x%s==0}
2.如何为元组中的每个元素命名,提高程序可读性
学生信息系统中数据为固定格式:{名字,年龄,性别,邮箱地址} ,但学生数量很大时,为了减小存储开销,对每个学生信息用元组表示:(‘sun’,20,’male’,sun@163.com’) 。但访问时,采用索引访问,大量索引降低了程序可读性,如何解决这个问题?(元素存储空间小,访问速度快,但是可读性差)
解决方法:
#方法1--索引号赋值 student=('sun' ,20,'male','sun@163.com') name,age,gender,email=range(4) student[name] student[age] student[gender] student[email] #方法2--namedtuple函数 from collections import namedtuple Student=namedtuple('Student',['name','age','gender','email']) s=Student('sun' ,20,'male','sun@163.com') #可以用位置传参,也可以用关键字传参数 s.age s.name s.email s.gender # isinstance(s,tuple) ----> True 判断这个元素是否是元组
3.如何统计序列中元素的出现频度
某个随机序列[9,3,5,6,9,2,4]中,找到出现次数最高的3个元素,他们出现次数是多少?对某英文文章的单词,进行词频统计,找到出现次数最高的10个单词,他们出现的次数是多少?
解决方法
#方法1--for遍历 from random import randint data=[randint(0,20) for _ in range(20)] c=dict.fromkeys(data,0) #dict.fromkeys(iterable, value=None, /) # Returns a new dict with keys from iterable and values equal to value. for x in data: c[x]+=1 #方法2--Counter函数 from collections import Counter c2=Counter(c) c2.most_common(3) #拓展--英语试卷词频统计 import re '''需要注意两点:open函数的url,在wins中不可直接copy;文件读写时注意编码格式(此时已经修改)''' data=open(r'C:\Users\poliy\Desktop\2017年上海高考英语真题试卷.txt').read() c3=Counter(re.split('\W+',data)) c3.most_common(100)
4.如何根据字典中值的大小,对字典中的项排序
某班英语成绩以字典形式存储为 {‘sun’:99,’lele’:77,’mingming’:88}根据成绩高低,计算学生排名解决方法
#方法1--zip函数 from random import randint d={x:randint(60,100) for x in "abcdefg"} t=zip(d.values(),d.keys()) #return a zip object whose .__next__() method returns a tuple sorted(t) #方法2--sorted函数 d.items() sorted(d.items(),key=lambda x:x[1])
5.如何快速找到镀铬字典中的公共键
西班牙足球甲级联赛,每轮球员进球统计: 第一轮:{‘sun’:1,’jun’:3,’kk’:2}第二轮:{‘sun’:1,’jun’:3,’kk’:2} 统计出前N轮,每场比赛都进球的球员
解决方法:
#方法1--for遍历 from random import randint, sample d1={x:randint(1,4) for x in sample('abcdeg',randint(3,6))} d2={x:randint(1,4) for x in sample('abcdeg',randint(3,6))} d3={x:randint(1,4) for x in sample('abcdeg',randint(3,6))} l=[] for k in d1: if k in d2 and k in d3: l.append(k) #方法2--集合交集 d1.keys()&d2.keys()&d3.keys() #方法3--map与reduce函数 from functools import reduce reduce(lambda a,b:a&b,map(dict.keys,[d1,d2,d3]))
注意:在python3中,reduce函数被封装在functools模块中
6.如何让字典保存有有序
某编程竞赛系统,对参赛选手编程题进行记时,选手完成题目后,把选手解题用时记录到字典中以便赛后按选手名查询成绩。(答题用时越短,成绩越优){‘lele’:(2,43),’sun’,(5,63),’jun’:(1,35)} 比赛结束后,需按排名依次打印选手成绩,如何实现?
解决办法
#方法--for遍历 from time import time,sleep from random import randint from collections import OrderedDict players=list('ABCDEFGH') d=OrderedDict() start=time() for i in range(8): sleep(0.1) p=players.pop(randint(0,7-i)) end=time() print(i+1,p,end-start) d[p]=(i+1,end-start) for k in d: print(k,d[k])
7.如何实现用户的历史记录(最多n条)?
很多应用程序都有浏览用户的历史记录的功能,例如浏览器可以查看最近访问的网页现在制作一个简单的猜数字的小游戏,添加历史记录功能,显示用户最近猜过的数字,如何实现?
解决办法:
from random import randint from collections import deque import pickle #生成一个初始值为空列表,容量为5的队列 history=deque([],5) n=randint(0,100) #猜大小函数 def guess(k): if k==n: print('right') return True elif k<n: print('%s is less than n'% k) return False elif k>n: print('%s is greater than n'% k) return False #输入入口 while True: line=input('please input a number:') if line.isdigit(): k=int(line) history.append(k) if guess(k): break elif line=='history' or line=='h?': print(list(history)) elif line=='exit' or line=='quit': break #储存文件--pickle.dump pickle.dump(history,open('history.txt','wb')) #加载文件---pickle.load q=pickle.load(open('history.txt','rb')) print(q)
相关文章推荐
- Python中的高级数据结构
- C#2005 .NET3.0高级编程学习笔记————类和结构,类的数据成员,类的函数成员(方法、属性)
- 编程小白的第一本 python 入门书 学习笔记05 第六章 数据结构
- Python中的高级数据结构
- Java高级编程--数据结构
- C#2005 .NET3.0高级编程学习笔记————类和结构,类的数据成员,类的函数成员(方法、属性)
- Python中的高级数据结构
- 高级编程之数据结构
- Python高级编程-如何在列表,字典,集合中根据条件筛选数据?
- python中的高级数据结构
- UNIX环境高级编程学习之第六章系统数据文件和信息-取所有组名、GID
- Linux编程细节3-内核-数据结构
- python 数据结构-集合set
- python 教程 第七章、 数据结构
- python cookbook 数据结构
- Python高级编程技巧
- python中数据结构的基本定义
- C# 高级编程 - .NET结构
- Python面向对象高级编程
- (编程训练)再回首,数据结构——二叉排序树的建立