您的位置:首页 > 理论基础 > 数据结构算法

python高级编程---数据结构

2018-03-19 00:07 357 查看
摘要:本文主要介绍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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python