6.python3实用编程技巧进阶(一)
1.1.如何在列表中根据条件筛选数据
# 1.1.如何在列表中根据条件筛选数据 data = [-1, 2, 3, -4, 5] #筛选出data列表中大于等于零的数据
#第一种方法,不推荐
res1 = []
for x in data:
if x >= 0:
res1.append(x) print(res1) #第二种用列表解析,推荐使用
res2 = [ x for x in data if x >= 0]
print(res2) #第三种用filter函数
res3 = list(filter(lambda x : x>= 0,data))
print(res3)
1.2.如何在字典中根据条件筛选数据
# 1.2.如何在字典中根据条件筛选数据 from random import randint #创建学生字典,学号为1~20,分数为50~100随机
d = {'student%d'% i: randint(50,100) for i in range(1,21)}
print(d) #过滤出分数为90的学生字典
#第一种方法
d1 = {k:v for k,v in d.items() if v >= 90}
print(d1) #第二种方法
d2 = dict(filter(lambda item:item[1] >= 90, d.items()))
print(d2)
1.3.如何在集合中根据条件筛选数据
# 1.3.如何在集合中根据条件筛选数据
from random import randint
s = {randint(0,20) for _ in range(20)}
print(s)
#筛选出能被3整除的数
s1 = {x for x in s if x % 3 == 0}
print(s1)
1.4.如何为元祖中的每个元素命名,提高程序可读性
如下元祖,通过函数判断年龄和性别,但是这样代码可读性很差,别人并不知道student[1],student[2]代表什么意思。如何解决呢
def func(student):
if student[1] < 18 :
pass if student[2] == 'male':
pass student = ('derek',22,'male','111@qq.com') func(student)
方案一:定义枚举类型
#1.4..如何为元祖中的每个元素命名,提高程序可读性 def func(student):
if student[1] < 18 :
pass if student[2] == 'male':
pass s1 = ('derek',22,'male','111@qq.com') #第一种:使用枚举
from enum import IntEnum class StudentEnum(IntEnum):
NAME = 0
AGE = 1
SEX = 2
EMAIL = 3 print(s1[StudentEnum.NAME])
print(s1[StudentEnum.AGE])
方案二:使用标准库中collections.namedtuple替代内置tuple
#1.4..如何为元祖中的每个元素命名,提高程序可读性 def func(student):
if student[1] < 18 :
pass if student[2] == 'male':
pass s1 = ('derek',22,'male','111@qq.com') #第一种:使用枚举
from enum import IntEnum class StudentEnum(IntEnum):
NAME = 0
AGE = 1
SEX = 2
EMAIL = 3 print(s1[StudentEnum.NAME])
print(s1[StudentEnum.AGE]) #第二种:使用标准库中collections.namedtuple替代内置tuple
from collections import namedtuple Student = namedtuple('student',['name','age','sex','email'])
s2 = Student('derek',22,'male','222@qq.com')
print(s2[0]) #derek
# 可以通过s2.name获取姓名
print(s2.name) #derek
1.5.如何根据字典中值的大小,对字典中的项进行排序
第一种方法:列表解析
# 1.5.如何根据字典中值的大小,对字典中的项进行排序
from random import randint
d = {k: randint(60, 100) for k in 'abcdefg'}
print(d)
#第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
list1 = [(v,k) for k,v in d.items()]
#或者使用zip()函数
# list2 = list(zip(d.values(),d.keys()))
print(list1)
list1 = sorted(list1,reverse=True)
print(list1)
第二种使用sorted
# 1.5.如何根据字典中值的大小,对字典中的项进行排序
from random import randint
d = {k: randint(60, 100) for k in 'abcdefg'}
print(d)
#第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
list1 = [(v,k) for k,v in d.items()]
#或者使用zip()函数
# list2 = list(zip(d.values(),d.keys()))
list1 = sorted(list1,reverse=True)
#第二种方法:使用sorted排序
p = sorted(d.items(),key=lambda item:item[1],reverse=True)
print(p) #[('a', 97), ('b', 93), ('d', 93), ('e', 92), ('f', 76), ('c', 66), ('g', 61)]
#对分数添加一个排名
d = {k:(i,v) for i, (k,v) in enumerate(p,1)}
print(d) #{'g': (1, 97), 'd': (2, 92), 'f': (3, 91), 'c': (4, 79), 'a': (5, 78), 'e': (6, 67), 'b': (7, 64)}
1.6.如何统计序列中元素的频度
# 1.6如何统计序列中元素的频度
from random import randint
from collections import Counter data = [randint(1,5) for _ in range(1,20)]
print(data) #[5, 2, 1, 2, 5, 3, 1, 1, 1, 4, 2, 5, 3, 2, 3, 5, 1, 2, 5] #计算频度最高的是三个数
c = Counter(data)
print(c.most_common(3)) #[(1, 5), (3, 4), (2, 4)]
1.7.如何快速找到多个字典中的公共键
# 1.7.如何快速找到多个字典中的公共键 from random import randint,sample
from functools import reduce 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))} #1.使用字典的keys()方法,得到一个字典keys的集合
#2.使用map函数,得到每个字典keys的集合
#3.使用reduce,取所有字典keys集合的交集 dl = [d1,d2,d3]
#找到三个字典中相同的keys
result = reduce(lambda a,b: a & b, map(dict.keys, dl))
print(result)
1.8.如何让字典保持有序
# 1.8.如何让字典保持有序 from collections import OrderedDict
from itertools import islice d = OrderedDict()
d['e'] = 5
d['d'] = 4
d['c'] = 3
d['b'] = 2
d['a'] = 1 print(d) #OrderedDict([('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)]) #OrderedDict字典,在迭代操作时,它会保持元素被插入时的顺序 def query_by_order(d, a, b =None):
if b is None:
b = a + 1
return list(islice(d,a,b)) #第五个key
res1 = query_by_order(d,4)
print(res1) #['a'] #第二个和第三个key
res2 = query_by_order(d,1,3)
print(res2) #['d', 'c']
1.9.如何实现用户的历史记录功能
使用容量为n的队列存储历史记录
- 使用deque双端循环队列存储历史记录(deque是保存到内存中,下次启动历史记录会消失)
- 如果想保存到硬盘中,使用pickle模块,以便下次启动使用
# 1.9如何实现用户的历史记录功能 from random import randint
from collections import deque
import pickle 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]请输入一个数字:' % i)
if line.isdigit():
k = int(line)
hq.append(k)
i += 1
if guess(n, k):
break
elif line == 'quit':
break
elif line == 'history':
print(hq) if __name__ == '__main__':
main() #结果
[1]请输入一个数字:1
猜小了,比1大
[2]请输入一个数字:2
猜小了,比2大
[3]请输入一个数字:3
猜小了,比3大
[4]请输入一个数字:history
deque([1, 2, 3], maxlen=5)
[4]请输入一个数字:
6.python3实用编程技巧进阶(一)的更多相关文章
- Python3实用编程技巧进阶 ☝☝☝
Python3实用编程技巧进阶 ☝☝☝ 1.1.如何在列表中根据条件筛选数据 # 1.1.如何在列表中根据条件筛选数据 data = [-1, 2, 3, -4, 5] #筛选出data列表中大于等 ...
- Python3实用编程技巧进阶✍✍✍
Python3实用编程技巧进阶 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...
- Python3实用编程技巧进阶
Python3实用编程技巧进阶 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...
- 7.python3实用编程技巧进阶(二)
2.1.如何拆分含有多种分隔符的字符串 #2.1.如何拆分含有多种分隔符的字符串 s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' #第一种方法 def my__ ...
- 8.python3实用编程技巧进阶(三)
3.1.如何实现可迭代对象和迭代器对象 #3.1 如何实现可迭代对象和迭代器对象 import requests from collections.abc import Iterable,Iterat ...
- 9.python3实用编程技巧进阶(四)
4.1.如何读写csv数据 爬取豆瓣top250书籍 import requests import json import csv from bs4 import BeautifulSoup book ...
- 10.python3实用编程技巧进阶(五)
5.1.如何派生内置不可变类型并修其改实例化行为 修改实例化行为 # 5.1.如何派生内置不可变类型并修其改实例化行为 #继承内置tuple, 并实现__new__,在其中修改实例化行为 class ...
- EF – 2.EF数据查询基础(上)查询数据的实用编程技巧
目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...
- EF – 2.EF数据查询基础(上)查询数据的实用编程技巧
目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...
随机推荐
- JavaScript 使用new关键字调用函数
使用new关键字调用函数 test.js 代码如下 function Person(name, age, obj) { var o = new Object(); o.name = name; o.a ...
- Python安装常见问题(1):zipimport.ZipImportError: can't decompress data(此问题不解决pip安装不成功)
在CentOS以及其他的Linux系统中遇到安装包安装错误的原因,大多数都是因为缺少依赖包导致的,所以对于错误:zipimport.ZipImportError: can’t decompress d ...
- 初级模拟电路:3-2 BJT的工作原理
回到目录 和前面介绍二极管的PN结的工作原理一样,BJT的量子级工作机制也非常复杂,一般教科书上为了帮助学习者能快速理解,也都是用一种简化模型的方法来介绍BJT的工作机理,一般只需大致了解即可.只要记 ...
- WinFrom和WebFrom的区别
原文链接:https://blog.csdn.net/sloder/article/details/6145169 一是Winform的定位机制没有Webform丰富,web里有table,div(浮 ...
- Java实战|Tomcat+Servlet+Sql开发简单网站,从配置环境开始
课题描述: Java实验五 Servlet (继续使用实验四中创建的students数据库和其中的scores表) 使用Tomcat作为Web服务器和Servlet容器,使用SQL Server/My ...
- Linux中vim和vi编辑器的使用
vim 和 vi 的关系: 可以将vim视作vi的高级版本,vim可以用颜色或下划线的方式来显示一些特殊信息.vim不止是文本处理软件,而可以说是一个程序开发工具.因为vim里面加入了很多额外功能,例 ...
- MQ的深入理解
MQ的深入理解 MQ的作用: 解耦合,降低系统与系统之间的频繁改动 MQ的特点: 复杂的系统解耦合 (主系统将数据放入mq,子系统需要的时候直接从mq中取出数据)复杂链路的异步调用(将必要的链路执行完 ...
- LeetCode 599: 两个列表的最小索引总和 Minimum Index Sum of Two Lists
题目: 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. Suppose Andy and Doris want to cho ...
- IT兄弟连 Java语法教程 注释与编码规范
在程序代码中适当地添加注释可以提高程序的可读性和可维护性.好的编码规范可以使程序更易阅读和理解.下面将介绍Java中的集中代码注释以及应该注意的编码规范. 代码注释 通过在程序代码中添加注释可提高程序 ...
- 【shell脚本语法】判断、流程控制语句
目录 判断用户参数 流程控制语句 一.判断用户参数 1.1 文件判断参数 PS:$?代表上一个命令的返回值,为0表示正确执行,非0表示错误执行.详情可参考我另一篇博客:https://www.cnbl ...