1.1.如何在列表中根据条件筛选数据

  1. # 1.1.如何在列表中根据条件筛选数据
  2.  
  3. data = [-1, 2, 3, -4, 5]
  4.  
  5. #筛选出data列表中大于等于零的数据
  6. #第一种方法,不推荐
  7. res1 = []
  8. for x in data:
  9. if x >= 0:
  10. res1.append(x)
  11.  
  12. print(res1)
  13.  
  14. #第二种用列表解析,推荐使用
  15. res2 = [ x for x in data if x >= 0]
  16. print(res2)
  17.  
  18. #第三种用filter函数
  19. res3 = list(filter(lambda x : x>= 0,data))
  20. print(res3)

1.2.如何在字典中根据条件筛选数据

  1. # 1.2.如何在字典中根据条件筛选数据
  2.  
  3. from random import randint
  4.  
  5. #创建学生字典,学号为1~20,分数为50~100随机
  6. d = {'student%d'% i: randint(50,100) for i in range(1,21)}
  7. print(d)
  8.  
  9. #过滤出分数为90的学生字典
  10. #第一种方法
  11. d1 = {k:v for k,v in d.items() if v >= 90}
  12. print(d1)
  13.  
  14. #第二种方法
  15. d2 = dict(filter(lambda item:item[1] >= 90, d.items()))
  16. print(d2)

1.3.如何在集合中根据条件筛选数据

  1. # 1.3.如何在集合中根据条件筛选数据
  2.  
  3. from random import randint
  4.  
  5. s = {randint(0,20) for _ in range(20)}
  6. print(s)
  7.  
  8. #筛选出能被3整除的数
  9. s1 = {x for x in s if x % 3 == 0}
  10. print(s1)

1.4.如何为元祖中的每个元素命名,提高程序可读性

如下元祖,通过函数判断年龄和性别,但是这样代码可读性很差,别人并不知道student[1],student[2]代表什么意思。如何解决呢

  1. def func(student):
  2. if student[1] < 18 :
  3. pass
  4.  
  5. if student[2] == 'male':
  6. pass
  7.  
  8. student = ('derek',22,'male','111@qq.com')
  9.  
  10. func(student)

方案一:定义枚举类型

  1. #1.4..如何为元祖中的每个元素命名,提高程序可读性
  2.  
  3. def func(student):
  4. if student[1] < 18 :
  5. pass
  6.  
  7. if student[2] == 'male':
  8. pass
  9.  
  10. s1 = ('derek',22,'male','111@qq.com')
  11.  
  12. #第一种:使用枚举
  13. from enum import IntEnum
  14.  
  15. class StudentEnum(IntEnum):
  16. NAME = 0
  17. AGE = 1
  18. SEX = 2
  19. EMAIL = 3
  20.  
  21. print(s1[StudentEnum.NAME])
  22. print(s1[StudentEnum.AGE])

方案二:使用标准库中collections.namedtuple替代内置tuple

  1. #1.4..如何为元祖中的每个元素命名,提高程序可读性
  2.  
  3. def func(student):
  4. if student[1] < 18 :
  5. pass
  6.  
  7. if student[2] == 'male':
  8. pass
  9.  
  10. s1 = ('derek',22,'male','111@qq.com')
  11.  
  12. #第一种:使用枚举
  13. from enum import IntEnum
  14.  
  15. class StudentEnum(IntEnum):
  16. NAME = 0
  17. AGE = 1
  18. SEX = 2
  19. EMAIL = 3
  20.  
  21. print(s1[StudentEnum.NAME])
  22. print(s1[StudentEnum.AGE])
  23.  
  24. #第二种:使用标准库中collections.namedtuple替代内置tuple
  25. from collections import namedtuple
  26.  
  27. Student = namedtuple('student',['name','age','sex','email'])
  28. s2 = Student('derek',22,'male','222@qq.com')
  29. print(s2[0]) #derek
  30. # 可以通过s2.name获取姓名
  31. print(s2.name) #derek

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

第一种方法:列表解析

  1. # 1.5.如何根据字典中值的大小,对字典中的项进行排序
  2.  
  3. from random import randint
  4.  
  5. d = {k: randint(60, 100) for k in 'abcdefg'}
  6. print(d)
  7. #第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
  8. list1 = [(v,k) for k,v in d.items()]
  9. #或者使用zip()函数
  10. # list2 = list(zip(d.values(),d.keys()))
  11. print(list1)
  12. list1 = sorted(list1,reverse=True)
  13. print(list1)

第二种使用sorted

  1. # 1.5.如何根据字典中值的大小,对字典中的项进行排序
  2.  
  3. from random import randint
  4.  
  5. d = {k: randint(60, 100) for k in 'abcdefg'}
  6. print(d)
  7. #第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
  8. list1 = [(v,k) for k,v in d.items()]
  9. #或者使用zip()函数
  10. # list2 = list(zip(d.values(),d.keys()))
  11.  
  12. list1 = sorted(list1,reverse=True)
  13.  
  14. #第二种方法:使用sorted排序
  15. p = sorted(d.items(),key=lambda item:item[1],reverse=True)
  16. print(p) #[('a', 97), ('b', 93), ('d', 93), ('e', 92), ('f', 76), ('c', 66), ('g', 61)]
  17.  
  18. #对分数添加一个排名
  19. d = {k:(i,v) for i, (k,v) in enumerate(p,1)}
  20. 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. # 1.6如何统计序列中元素的频度
  2. from random import randint
  3. from collections import Counter
  4.  
  5. data = [randint(1,5) for _ in range(1,20)]
  6. print(data) #[5, 2, 1, 2, 5, 3, 1, 1, 1, 4, 2, 5, 3, 2, 3, 5, 1, 2, 5]
  7.  
  8. #计算频度最高的是三个数
  9. c = Counter(data)
  10. print(c.most_common(3)) #[(1, 5), (3, 4), (2, 4)]

1.7.如何快速找到多个字典中的公共键

  1. # 1.7.如何快速找到多个字典中的公共键
  2.  
  3. from random import randint,sample
  4. from functools import reduce
  5.  
  6. d1 = {k:randint(1,4) for k in sample('abcdefgh',randint(3,6))}
  7. d2 = {k:randint(1,4) for k in sample('abcdefgh',randint(3,6))}
  8. d3 = {k:randint(1,4) for k in sample('abcdefgh',randint(3,6))}
  9.  
  10. #1.使用字典的keys()方法,得到一个字典keys的集合
  11. #2.使用map函数,得到每个字典keys的集合
  12. #3.使用reduce,取所有字典keys集合的交集
  13.  
  14. dl = [d1,d2,d3]
  15. #找到三个字典中相同的keys
  16. result = reduce(lambda a,b: a & b, map(dict.keys, dl))
  17. print(result)

1.8.如何让字典保持有序

  1. # 1.8.如何让字典保持有序
  2.  
  3. from collections import OrderedDict
  4. from itertools import islice
  5.  
  6. d = OrderedDict()
  7. d['e'] = 5
  8. d['d'] = 4
  9. d['c'] = 3
  10. d['b'] = 2
  11. d['a'] = 1
  12.  
  13. print(d) #OrderedDict([('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)])
  14.  
  15. #OrderedDict字典,在迭代操作时,它会保持元素被插入时的顺序
  16.  
  17. def query_by_order(d, a, b =None):
  18. if b is None:
  19. b = a + 1
  20. return list(islice(d,a,b))
  21.  
  22. #第五个key
  23. res1 = query_by_order(d,4)
  24. print(res1) #['a']
  25.  
  26. #第二个和第三个key
  27. res2 = query_by_order(d,1,3)
  28. print(res2) #['d', 'c']

1.9.如何实现用户的历史记录功能

使用容量为n的队列存储历史记录

  • 使用deque双端循环队列存储历史记录(deque是保存到内存中,下次启动历史记录会消失)
  • 如果想保存到硬盘中,使用pickle模块,以便下次启动使用
  1. # 1.9如何实现用户的历史记录功能
  2.  
  3. from random import randint
  4. from collections import deque
  5. import pickle
  6.  
  7. def guess(n, k):
  8. if n == k:
  9. print('猜对了,这个数字是%d' % k)
  10. return True
  11. if n < k:
  12. print('猜大了,比%d小' % k)
  13. elif n > k:
  14. print('猜小了,比%d大' % k)
  15. return False
  16.  
  17. def main():
  18. n = randint(1, 100)
  19. i = 1
  20. hq = deque([], 5)
  21. while True:
  22. line = input('[%d]请输入一个数字:' % i)
  23. if line.isdigit():
  24. k = int(line)
  25. hq.append(k)
  26. i += 1
  27. if guess(n, k):
  28. break
  29. elif line == 'quit':
  30. break
  31. elif line == 'history':
  32. print(hq)
  33.  
  34. if __name__ == '__main__':
  35. main()
  36.  
  37. #结果
  38. [1]请输入一个数字:1
  39. 猜小了,比1
  40. [2]请输入一个数字:2
  41. 猜小了,比2
  42. [3]请输入一个数字:3
  43. 猜小了,比3
  44. [4]请输入一个数字:history
  45. deque([1, 2, 3], maxlen=5)
  46. [4]请输入一个数字:

6.python3实用编程技巧进阶(一)的更多相关文章

  1. Python3实用编程技巧进阶 ☝☝☝

    Python3实用编程技巧进阶  ☝☝☝ 1.1.如何在列表中根据条件筛选数据 # 1.1.如何在列表中根据条件筛选数据 data = [-1, 2, 3, -4, 5] #筛选出data列表中大于等 ...

  2. Python3实用编程技巧进阶✍✍✍

    Python3实用编程技巧进阶  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...

  3. Python3实用编程技巧进阶

    Python3实用编程技巧进阶  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...

  4. 7.python3实用编程技巧进阶(二)

    2.1.如何拆分含有多种分隔符的字符串 #2.1.如何拆分含有多种分隔符的字符串 s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' #第一种方法 def my__ ...

  5. 8.python3实用编程技巧进阶(三)

    3.1.如何实现可迭代对象和迭代器对象 #3.1 如何实现可迭代对象和迭代器对象 import requests from collections.abc import Iterable,Iterat ...

  6. 9.python3实用编程技巧进阶(四)

    4.1.如何读写csv数据 爬取豆瓣top250书籍 import requests import json import csv from bs4 import BeautifulSoup book ...

  7. 10.python3实用编程技巧进阶(五)

    5.1.如何派生内置不可变类型并修其改实例化行为 修改实例化行为 # 5.1.如何派生内置不可变类型并修其改实例化行为 #继承内置tuple, 并实现__new__,在其中修改实例化行为 class ...

  8. EF – 2.EF数据查询基础(上)查询数据的实用编程技巧

    目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...

  9. EF – 2.EF数据查询基础(上)查询数据的实用编程技巧

    目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...

随机推荐

  1. DevOps VS 职责分离

    原文地址: https://medium.com/@jeehad.jebeile/devops-and-segregation-of-duties-9c1a1bea022e 原文作者:Jeehad J ...

  2. RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...

  3. [20191101]通过zsh计算sql语句的sql_id.txt

    [20191101]通过zsh计算sql语句的sql_id.txt 1.简单介绍以及测试使用zsh遇到的问题:--//前段时间写的,链接http://blog.itpub.net/267265/vie ...

  4. EM13C添加agent记录两个报错

    错误一:ADF_FACES-60097:For more information, please see the server's error log for an entry beginning w ...

  5. SQL Prompt提示和SQL默认智能提示冲突解决

  6. SQL Server有意思的数据类型隐式转换问题

    写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CRE ...

  7. 激活windows操作系统的命令行指令

    1.开始菜单中搜索命令提示符,右键管理员运行 2.为了避免激活的失败,首先卸载已经过期的密钥 输入以下命令:slmgr.vbs /upk 回车确认之后会弹出提示“已成功卸载了产品密钥” 3.下一步是将 ...

  8. MySQL问题记录——2003-Can't connect to MySQL server on 'localhost'(10038)

    MySQL问题记录——2003-Can't connect to MySQL server on 'localhost'(10038) 摘要:本文主要记录了连接到MySQL数据库时出现的问题以及解决办 ...

  9. July 20th, 2019. Week 29th, Saturday

    If we just open the door a crack, the light comes pouring in. 只要把门开个小口,光就会倾泻而入. Don't be so disheart ...

  10. leetcode回溯算法--基础难度

    都是直接dfs,算是巩固一下 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 思路 一直 ...