zoukankan      html  css  js  c++  java
  • 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模块将历史记录存储到硬盘,以便下次启动使用

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

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

  • 相关阅读:
    一起学Python:协程
    一起学Python:字符串介绍
    一起学Python:列表介绍
    一起学Python:字典介绍
    一起学Python:元组
    函数介绍
    函数参数和函数返回值
    CodeForces 680A&680B&680C&680D Round#356
    POJ 3481 set水过
    BZOJ 1037 生日聚会 DP
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12781146.html
Copyright © 2011-2022 走看看