• Python进阶全系列


    1.推导式

    1. import random
    2. #列表解析
    3. L=[random.randint(-10,10) for _ in range(10)]#随机生成长度为10的随机列表
    4. print(L)
    5. #选取大于0的元素
    6. #方法一
    7. print([x for x in L if x>0])
    8. #方法二:
    9. g=filter(lambda x:x>0,L)
    10. print(list(g))
    11. #字典解析练习
    12. #方法一:
    13. D={'stu%d'%i:random.randint(0,100) for i in range(1,21)}
    14. print(D)
    15. print("优秀的学生如下:\n",{k:v for k,v in D.items() if v>=84})
    16. #方法二:
    17. print("优秀的学生如下2:\n",dict(filter(lambda item:item[1]>=85,D.items())))

    2.将下标对应到具体含义,提高可读性

    1. """
    2. 将下标替换成语义,使代码可读性好的方法
    3. """
    4. s=("张三",19,"男")
    5. #方法一:赋值
    6. name,age,sex=range(3)
    7. print("方法一:",s[name],s[age],s[sex])
    8. #方法二:枚举
    9. from enum import IntEnum
    10. class StudentEnum(IntEnum):
    11. NAME=0
    12. AGE=1
    13. SEX=2
    14. print("方法二:",s[StudentEnum.NAME],s[StudentEnum.AGE],s[StudentEnum.SEX])
    15. #方法三:利用构造器构造
    16. from collections import namedtuple
    17. Student=namedtuple('Student',['name','age','sex'])#namedtuple返回一个类,类名为Student
    18. s2=Student('Jim',18,"male")#s2是Student这个类的实例, s2是一个tuple类型
    19. print("方法三(1):",s2.name,s2.age,s2.sex)
    20. print(" s2是一个tuple类型吗?",isinstance(s2,tuple))
    21. #既然s2是元组,那么就可以按照元组方式访问
    22. print("方法三(2):",s2[name],s2[age],s2[sex])

    运行结果:

    3.根据字典中值的大小,对项进行排序

    解决方法:将字典中的各项转换为元组,使用内置函数sorted 排序。

            方案一:将字典中的项转化为(值,键)元组。(列表解析或zip )

    1. T=(1,3,1,5,2,6)
    2. print("验证元组是可以排序的:",sorted(T))#元组是可以排序的
    3. print("元组的比较方法与字符串一样:(3,2)>(2,4)?",("Yes" if (3,2)>(2,4) else "No"))
    4. print(" (3,2)>(3,4)?",("Yes" if (3,2)>(3,4) else "No"),end='\n\n')
    5. import random
    6. d={k:random.randint(60,100) for k in "abcdefgh"}
    7. print("d=",d)
    8. #方案一(1):使用列表解析将字典转换为元组从而比较大小
    9. d1={(v,k) for k,v in d.items()}#因为元组可以比较大小,所以生成元组
    10. print("交换key和value的顺序后:",d1)
    11. print("按照数字从大到小的顺序为:",sorted(d1,reverse=True),end="\n\n")
    12. #方案一(2):使用zip
    13. d2=list(zip(d.values(),d.keys()))
    14. print("zip函数的使用介绍:",d2)
    15. print("使用zip方法排序后的结果:",sorted(d2))

            方案一的运行结果:

            方案二:传递sorted函数的key参数

    1. #方案二:使用sorted的key参数
    2. d3=sorted(d.items(),key=lambda item:item[1],reverse=True)
    3. print("使用sorted的key参数:",d3)
    4. #标记为第一名、第二名...
    5. l3=list(enumerate(d3,1))
    6. print("标记完的结果:",l3)#1表示从1开始,默认为0
    7. dd3={k:(i,v) for i,(k,v) in enumerate(d3,1)}
    8. print("方案二的最终结果为",dd3)

            方案二的运行结果:

    4.统计序列中元素的频度

            方案1:将序列转换为字典{元素:频度},根据字典中的值排序。

    1. import random
    2. data=[random.randint(0,20) for _ in range(30)]
    3. print("data为:",data)
    4. d=dict.fromkeys(data,0)#赋初值全为0,key为data的元素,切去除重复
    5. for x in data:
    6. d[x]+=1
    7. print("统计后的结果为:",d)
    8. #根据出现频度排序:大->小
    9. dd=sorted(d.items(),key=lambda item:item[1],reverse=True)
    10. print("排序后的结果为:",dd)
    11. print("并找到频度最高的前三个:",dd[:3])
    12. #从一大堆数据中找出前三个:堆
    13. import heapq
    14. print("使用堆来寻找前三个元素:",heapq.nlargest(3,((v,k) for k,v in d.items())))#3表示取前三个

            方案一的运行结果:

            方案二:使用标准库collections中的Counter对象。

    1. #方案二:使用collections中的Counter对象
    2. from collections import Counter
    3. c=Counter(data)
    4. print("使用Counter得到的前三个结果是:",c.most_common(3))

              方案二的运行结果:

     

    5.快速找到多个字典中的公共键(key)

            方案:利用集合(set)的交集操作
                

    1. from random import randint,sample
    2. #sample是随机抽取
    3. print("测试sample函数:",sample("abcdefgh",randint(3,6)),end='\n\n')#随机抽取3-6人
    4. #创建每一轮的球员,以及对应球员踢得球数
    5. d1={k:randint(1,4) for k in sample("abcdefgh",randint(3,6))}
    6. d2={k:randint(1,4) for k in sample("abcdefgh",randint(3,6))}
    7. d3={k:randint(1,4) for k in sample("abcdefgh",randint(3,6))}
    8. print("第一场:",d1)
    9. print("第二场:",d2)
    10. print("第三场:",d3)
    11. dA=[d1,d2,d3]
    12. #方法一:利用生成器
    13. ans=[k for k in dA[0] if all(map(lambda d:k in d,dA[1:]))]
    14. print("结果为:",ans,end="\n\n")
    15. #方法二:利用集合的交集
    16. from functools import reduce
    17. #reduce的运用介绍
    18. print("reduce的运用介绍。 10!=",reduce(lambda x,y:x*y,range(1,11)))
    19. print("方法二的运行结果:",reduce(lambda x,y:x and y,map(dict.keys,dA)))

            运行结果:

  • 相关阅读:
    【如何使用Medooze 实现多方视频会议】
    流媒体传输 - HLS 协议
    java面试题超详细讲解整理总结分析【java基础】
    y111.第六章 微服务、服务网格及Envoy实战 -- Envoy网格安全(二二)
    AI:09-基于深度学习的图像场景分类
    Android超级好看的动态登陆界面(附有详细代码)
    机器学习-分类器-总结
    线程状态有几种,简单问题资料却都错了!|原创
    JavaScript的字符串介绍
    SpringBoot @TransactionalEventListener&JavaMailSender使用
  • 原文地址:https://blog.csdn.net/m0_58086930/article/details/124284469