摘要:本文主要介绍python3中list、set、tuple、dict等类型数据的筛选查找。
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)