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 ...
随机推荐
- DevOps VS 职责分离
原文地址: https://medium.com/@jeehad.jebeile/devops-and-segregation-of-duties-9c1a1bea022e 原文作者:Jeehad J ...
- RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...
- [20191101]通过zsh计算sql语句的sql_id.txt
[20191101]通过zsh计算sql语句的sql_id.txt 1.简单介绍以及测试使用zsh遇到的问题:--//前段时间写的,链接http://blog.itpub.net/267265/vie ...
- EM13C添加agent记录两个报错
错误一:ADF_FACES-60097:For more information, please see the server's error log for an entry beginning w ...
- SQL Prompt提示和SQL默认智能提示冲突解决
- SQL Server有意思的数据类型隐式转换问题
写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CRE ...
- 激活windows操作系统的命令行指令
1.开始菜单中搜索命令提示符,右键管理员运行 2.为了避免激活的失败,首先卸载已经过期的密钥 输入以下命令:slmgr.vbs /upk 回车确认之后会弹出提示“已成功卸载了产品密钥” 3.下一步是将 ...
- MySQL问题记录——2003-Can't connect to MySQL server on 'localhost'(10038)
MySQL问题记录——2003-Can't connect to MySQL server on 'localhost'(10038) 摘要:本文主要记录了连接到MySQL数据库时出现的问题以及解决办 ...
- July 20th, 2019. Week 29th, Saturday
If we just open the door a crack, the light comes pouring in. 只要把门开个小口,光就会倾泻而入. Don't be so disheart ...
- leetcode回溯算法--基础难度
都是直接dfs,算是巩固一下 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 思路 一直 ...