- 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())))
-
-
- """
- 将下标替换成语义,使代码可读性好的方法
- """
- 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])
运行结果:
解决方法:将字典中的各项转换为元组,使用内置函数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)
方案二的运行结果:
方案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))
方案二的运行结果:
方案:利用集合(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)))
运行结果: