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

摘要:本文主要介绍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)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值