Python进阶全系列

1.推导式

import random

#列表解析
L=[random.randint(-10,10) for _ in range(10)]#随机生成长度为10的随机列表
print(L)
#选取大于0的元素
#方法一
print([x for x in L if x>0])

#方法二:
g=filter(lambda x:x>0,L)
print(list(g))


#字典解析练习
#方法一:
D={'stu%d'%i:random.randint(0,100) for i in range(1,21)}
print(D)
print("优秀的学生如下:\n",{k:v for k,v in D.items() if v>=84})

#方法二:
print("优秀的学生如下2:\n",dict(filter(lambda item:item[1]>=85,D.items())))


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

"""
    将下标替换成语义,使代码可读性好的方法
"""
s=("张三",19,"男")
#方法一:赋值
name,age,sex=range(3)
print("方法一:",s[name],s[age],s[sex])

#方法二:枚举
from enum import IntEnum
class StudentEnum(IntEnum):
    NAME=0
    AGE=1
    SEX=2
print("方法二:",s[StudentEnum.NAME],s[StudentEnum.AGE],s[StudentEnum.SEX])

#方法三:利用构造器构造
from collections import namedtuple
Student=namedtuple('Student',['name','age','sex'])#namedtuple返回一个类,类名为Student
s2=Student('Jim',18,"male")#s2是Student这个类的实例, s2是一个tuple类型
print("方法三(1):",s2.name,s2.age,s2.sex)
print("      s2是一个tuple类型吗?",isinstance(s2,tuple))
#既然s2是元组,那么就可以按照元组方式访问
print("方法三(2):",s2[name],s2[age],s2[sex])

运行结果:

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

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

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

T=(1,3,1,5,2,6)
print("验证元组是可以排序的:",sorted(T))#元组是可以排序的
print("元组的比较方法与字符串一样:(3,2)>(2,4)?",("Yes" if (3,2)>(2,4) else "No"))
print("               (3,2)>(3,4)?",("Yes" if (3,2)>(3,4) else "No"),end='\n\n')

import random
d={k:random.randint(60,100) for k in "abcdefgh"}
print("d=",d)

#方案一(1):使用列表解析将字典转换为元组从而比较大小
d1={(v,k) for k,v in d.items()}#因为元组可以比较大小,所以生成元组
print("交换key和value的顺序后:",d1)
print("按照数字从大到小的顺序为:",sorted(d1,reverse=True),end="\n\n")

#方案一(2):使用zip
d2=list(zip(d.values(),d.keys()))
print("zip函数的使用介绍:",d2)
print("使用zip方法排序后的结果:",sorted(d2))

        方案一的运行结果:

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

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

        方案二的运行结果:

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

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

import random
data=[random.randint(0,20) for _ in range(30)]
print("data为:",data)
d=dict.fromkeys(data,0)#赋初值全为0,key为data的元素,切去除重复
for x in data:
    d[x]+=1
print("统计后的结果为:",d)

#根据出现频度排序:大->小
dd=sorted(d.items(),key=lambda item:item[1],reverse=True)
print("排序后的结果为:",dd)
print("并找到频度最高的前三个:",dd[:3])

#从一大堆数据中找出前三个:堆
import heapq
print("使用堆来寻找前三个元素:",heapq.nlargest(3,((v,k) for k,v in d.items())))#3表示取前三个

        方案一的运行结果:

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

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

          方案二的运行结果:

 

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

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

from random import randint,sample
#sample是随机抽取
print("测试sample函数:",sample("abcdefgh",randint(3,6)),end='\n\n')#随机抽取3-6人

#创建每一轮的球员,以及对应球员踢得球数
d1={k:randint(1,4) for k in sample("abcdefgh",randint(3,6))}
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))}
print("第一场:",d1)
print("第二场:",d2)
print("第三场:",d3)
dA=[d1,d2,d3]
#方法一:利用生成器
ans=[k for k in dA[0] if all(map(lambda d:k in d,dA[1:]))]
print("结果为:",ans,end="\n\n")

#方法二:利用集合的交集
from functools import reduce
#reduce的运用介绍
print("reduce的运用介绍。 10!=",reduce(lambda x,y:x*y,range(1,11)))
print("方法二的运行结果:",reduce(lambda x,y:x and y,map(dict.keys,dA)))

        运行结果:

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值