- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Python进阶强化训练之数据结构与算法进阶
如何在列表、字典、集合中根据条件筛选数据?
实际问题
过滤列表中的负数
筛选出字典种值高于90的项
筛选出集合种能被3整出的元素
围绕上面三个问题我们来进行讨论,比如下面有一个列表:
from random import randint
li = [randint(-10, 10) for _ in range(10)]
li
[-10, -9, 1, 10, -3, -7, -6, -7, 4, -5]
我们常规的做法就是通过for循环对列表中的每一个值进行迭代,然后判断如果值大于等于0,就确定这个值是一个整数,否则就丢弃,比如下面的代码:
result = []
for n in li:
# 如果这个元素大于等于0
... if n = 0:
# 加入的result列表中
... result.append(n)
...
result
[1, 10, 4]
实例
本篇所有的代码均在Python 3.5.x种运行,如果你使用的是python 2.7.x,那么请自行测试,在此之前,请导入一下模块用于测试:
# 用于生成随机数
from random import randint
# 准确测量小段代码的执行时间
import timeit
请仔细阅读下面的代码,看完后你将会有不一样的收获。
列表
filter函数
生成一个随机列表
li = [randint(-10, 10) for _ in range(10)]
li
[6, -8, 9, 3, 3, 8, 9, -4, 9, -6]
# x=列表中的一个元素,有多少个元素就迭代多少次
result = filter(lambda x: x =0, li)
for n in result:
... print(n)
...
6
9
3
3
8
9
9
列表解析
生成一个随机列表
li = [randint(-10, 10) for _ in range(10)]
li
[8, -5, -2, 8, 9, 4, -6, -5, 5, 4]
[x for x in li if x =0 ]
[8, 8, 9, 4, 5, 4]
filter与列表解析性能对比
使用filter执行时间
timeit.Timer(filter(lambda x: x =0, [4, -1, 1, 3, -10, 5, -8, 0, 6, 3])).timeit()
0.38938787838583266
使用列表解析执行时间
timeit.Timer([x for x in [4, -1, 1, 3, -10, 5, -8, 0, 6, 3] if x =0 ]).timeit()
1.1142896312373978
通过以上的测试可以看出filter的执行时间明显比列表解析要快些,当然这并不是一个非常准确的数字,还是有待考察的。
字典
先随机生成一个字典:
dic = { x: randint(60, 100) for x in range(1, 21) }
dic
{1: 61, 2: 75, 3: 69, 4: 70, 5: 79, 6: 90, 7: 74, 8: 85, 9: 77, 10: 86, 11: 93, 12: 96, 13: 86, 14: 79, 15: 60, 16: 84, 17: 70, 18: 72, 19: 61, 20: 87}
字典解析
{ k: v for k, v in dic.items() if v 90 }
{11: 93, 12: 96}
集合
生成一个集合:
li = [randint(-10, 10) for _ in range(10)]
s = set(li)
s
{0, 1, 3, 4, 7, -9, -8}
集合解析
{ x for x in s if x % 3 == 0 }
{0, 3, -9}
如何为元组中的每个元素命名、提高程序可读性?
实际问题
某校的学生信息系统中的数据存储格式如下:
(名字,年龄,性别,邮箱地址)
比如有如下学生信息:
student1 = (Hello, 15, Schoolboy, hello@)
student2 = (World, 16, Girls, World@)
student3 = (ansheng, 20, Schoolboy, @)
.....
通常我们会以如下方式进行取值:
student1[2]
Schoolboy
student1[3]
hello@
在代码比较多的情况下,使用大量的索引进行访问会降低程序的可读性,如何解决这个问题呢?
方案1
定义类似于其他语言的枚举
文档评论(0)