欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python高效技巧笔记,数据结构与算法

程序员文章站 2022-03-08 13:17:03
1.如何在字典,序列,集合中根据条件筛选数据 实例案例: 过滤掉列表[3,9,-1...]中的负数,这里要注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数 ......

1.如何在字典,序列,集合中根据条件筛选数据

实例案例:

  • 过滤掉列表[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模块将历史记录存储到硬盘,以便下次启动使用

 

Python高效技巧笔记,数据结构与算法

 

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教程项目,还可以跟老司机交流讨教!

本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。