Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据
Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据
学习目标
1、学会使用 filter 借助 Lambda 表达式过滤列表、集合、元组中的元素;
2、学会使用列表解析、字典解析和集合解析;
3、学会使用随机数的库生成测试用例;
4、学会使用列表生成式创建列表。
列表生成式即 List Comprehensions ,是 Python 内置的非常简单却强大的可以用来创建 list 的生成式。
知识点与例题讲解
下面我们给出几种在列表、字典集合中筛选数据的解决方案:
1、列表
(1)filter 函数:filter(lamdba x:x>0,data)
;
(2)列表解析:[x for x in data if x>=0]
。
2、字典:
字典解析:{k:v for k,v in d.iteritems() if v>90}
。
3、集合:
集合解析:{x for x in s if x%3==0}
。
例1:过滤列表[3,9,-1,10,20,-2]中的负数,只得到正数。
下面展示的是一种传统的做法,这种做法的思路很简单,就是将列表中的元素进行遍历,然后逐个进行判断,符合条件的就添加到另一个集合中。
解答1:
# -*- coding:utf-8 -*-
data = [3, 9, -1, 10, 20, -2]
res = []
for x in data:
if x >= 0:
res.append(x)
print res
[3, 9, 10, 20]
程序运行结果:[3, 9, 10, 20]。
其实,我们可以使用 Python 提供的 filter 函数或者“列表解析”的语法来完成。
解答2:使用 filter 函数,传入一个 Lambda 表达式,达到过滤元素的目的。
# -*- coding:utf-8 -*-
from random import randint
# 注意:randint(-10, 10) 可以取到边界值 -10 和 10
data = [randint(-10, 10) for _ in xrange(10)]
print '随机生成的列表', data
filter_data = filter(lambda x: x > 0, data)
print '使用 filter 和 lambda 表达式过滤得到的新列表', filter_data
随机生成的列表 [6, 7, -8, 6, 1, 10, 5, -10, 5, 4]
使用 filter 和 lambda 表达式过滤得到的新列表 [6, 7, 6, 1, 10, 5, 5, 4]
执行结果:
随机生成的列表 [5, -3, 6, 5, -2, 4, -6, -5, 7, -3]
使用 filter 和 lambda 表达式过滤得到的新的列表 [5, 6, 5, 4, 7]。
说明:1、列表生成式在 python2.x 中使用 xrange() ,在 python3.x 中使用 range();
2、randint(-10, 10) 可以取到边界值 -10 和 10;
3、使用列表解析生成随机数的示例代码:
# -*- coding:utf-8 -*-
from random import randint
# 注意:randint(-10, 10) 可以取到边界值 -10 和 10
data = [randint(-10, 10) for _ in xrange(10)]
print data
[-7, -5, 2, 10, -8, 1, 6, 5, 4, -4]
4、使用 data.len() 得到列表的长度。
解答3:可以使用列表解析的方式,达到过滤列表的效果:
# -*- coding:utf-8 -*-
from random import randint
# 注意:randint(-10, 10) 可以取到边界值 -10 和 10
data = [randint(-10, 10) for _ in xrange(10)]
print '随机生成的列表', data
filter_data = [x for x in data if x > 0]
print '使用列表解析过滤的列表', filter_data
随机生成的列表 [8, -10, -4, 4, 7, 10, -7, -9, -7, -1]
使用列表解析过滤的列表 [8, 4, 7, 10]
执行结果:
随机生成的列表 [8, -2, -3, 6, 8, -10, -4, 5, 8, 2]
使用列表解析过滤的列表 [8, 6, 8, 5, 8, 2]
结论:列表解析(解答3)和 filter (解答2)的方式会更快一些,远快于我们使用传统的方案(解答1),我们可以使用 IPython 统计函数执行时间的工具类 timeit 来测试一下(待补充)。
例2:筛选出字典 {'liwei':80,'wudi':88,'yuanlian':75,'zhouguang':90} 中高于 85 的项
首先,我们先生成一组随机的字典:
# -*- coding:utf-8 -*-
from random import randint
data = {x: randint(60, 100) for x in xrange(1, 21)}
print data
{1: 87, 2: 93, 3: 66, 4: 82, 5: 65, 6: 72, 7: 94, 8: 75, 9: 99, 10: 79, 11: 71, 12: 86, 13: 65, 14: 85, 15: 73, 16: 71, 17: 86, 18: 88, 19: 68, 20: 92}
执行结果:{1: 91, 2: 100, 3: 95, 4: 93, 5: 79, 6: 83, 7: 79, 8: 80, 9: 77, 10: 98, 1。
说明:1、使用列表解析的方式生成的字典,要使用花括号括起来,这一点和例 1 的中使用中括号要区别开来;
2、字典的元素是键值对,所以使用 x: randint(60, 100)
,注意键和值中间有一个冒号;
3、xrange(1,21)
得到的列表不包括21,而 randint(60,100)
包括60,也包括 100,这一点要区别开来。
下面我们来解答这个问题,根据题目要求,我们须要根据值进行过滤,得到分数(value)大于 90 分的同学。我们的思路是:我们既然要同时迭代键和值,就要迭代它的 iteritems
(同时迭代字典中的键和值)。
# -*- coding:utf-8 -*-
from random import randint
data = {x: randint(60, 100) for x in xrange(1, 21)}
filter_data = {k: v for k, v in data.iteritems() if v > 90}
print '随机生成的字典',data
print '过滤以后的字典数据',filter_data
随机生成的字典 {1: 60, 2: 79, 3: 61, 4: 87, 5: 74, 6: 73, 7: 91, 8: 84, 9: 78, 10: 63, 11: 83, 12: 100, 13: 63, 14: 91, 15: 61, 16: 75, 17: 78, 18: 79, 19: 78, 20: 77}
过滤以后的字典数据 {12: 100, 14: 91, 7: 91}
执行结果:随机生成的字典 {1: 75, 2: 75, 3: 83, 4: 86, 5: 84, 6: 60, 7: 85, 8: 76, 9: 86, 10: 67, 11: 98, 12: 83, 13: 82, 14: 64, 15: 86, 16: 85, 17: 95, 18: 70, 19: 75, 20: 76}
过滤以后的字典数据 {17: 95, 11: 98}。
说明:1、对比列表解析和字典解析的语法:
列表解析:[x for x in data if x>0]
;
字典解析:{k:v for k,v in data.iteritems() if v>90}
。
2、默认情况下, dict 迭代的是 key 。如果要迭代 value ,可以用 for value in d.itervalues()
,如果要同时迭代 key 和 value ,可以用 for k, v in d.iteritems()
。因此,对于字典这个数据结构而言,可以遍历 iteritems 、所有的键、所有的值。
下面,我们来看一下集合解析的语法。
例3:筛选出集合{77,89,32,20,15,28}中能被 3 整除的元素
解法:
# -*- coding:utf-8 -*-
from random import randint
# 随机生成在 1 到 50(包括1和50)的列表
data = [randint(1, 50) for x in xrange(1, 21)]
print 'data', data
# 把列表放入集合中,删除了重复的元素
s = set(data)
print 's', s
# 使用集合的解析,得到了集合中能被 3 整除的元素
filter_set = {x for x in s if x % 3 == 0}
print 'filter_set', filter_set
data [17, 48, 25, 19, 35, 23, 43, 25, 20, 45, 42, 5, 48, 25, 42, 22, 50, 45, 16, 17]
s set([16, 35, 5, 42, 43, 45, 48, 17, 50, 19, 20, 22, 23, 25])
filter_set set([48, 42, 45])
执行结果:data [1, 45, 21, 16, 42, 50, 16, 39, 13, 36, 16, 43, 50, 3, 24, 34, 15, 1, 17, 9]
s set([1, 34, 3, 36, 39, 9, 42, 43, 45, 13, 16, 17, 50, 21, 24, 15])
filter_set set([3, 36, 39, 9, 42, 45, 15, 21, 24])
说明:
1、根据列表得到一个集合:s = set(list)
,可以将列表中重复的元素去除;
2、集合的解析没有冒号,表达式的结果也是使用花括号括起来的。
参考资料
1、廖雪峰老师的 Python 2.7 教程中关于“列表生成式”的讲解:
网址:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138681963899940a998c0ace64bb5ad45d1b56b103c48000
Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据的更多相关文章
- 如何在列表,字典,集合中,根据条件筛选数据 -- Python数据结构与算法相关问题与解决技巧
实际案例: 1.过滤掉列表 [3,9,-1,10,20,-2..]的负数 2.筛出字典{'LiLei':79,'Jim':88,'Lucy':92...}中值高于90的项 3.筛出集合 {77,89, ...
- python基础一 -------如何在列表字典集合中根据条件筛选数据
如何在列表字典集合中根据条件筛选数据 一:列表 先随机生成一个列表,过滤掉负数 1,普通for循环迭代判断 2,filter()函数判断,filter(函数,list|tuple|string) fi ...
- Python高效编程技巧实战 实战编程+面试典型问题 中高阶程序员过渡
下载链接:https://www.yinxiangit.com/603.html 目录: 如果你想用python从事多个领域的开发工作,且有一些python基础, 想进一步提高python应用能力 ...
- python数据结构-如何在列表、字典、集合中根据条件筛选数据
如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...
- python 学习笔记(一):在列表、字典、集合中根据条件筛选数据
一.在列表中筛选数据 在列表中筛选出大于等于零的数据,一般通用的用法代码如下: data = [3, -9, 0, 1, -6, 3, -2, 8, -6] #要筛选的原始数据列表 result = ...
- python3编程技巧二——如何在列表、字典、集合 中根据条件筛选数据
一.列表筛选数据 # coding=utf-8 from random import randint # 创建随机列表 l = [randint(-10, 10) for i in range(10) ...
- python基础===如何在列表,字典,集合中根据条件筛选数据
#常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...
- Py小技巧一:在列表,字典,集合中根据条件筛选数据
1.过滤掉列表中的某些项---列表解析 data=[1,4,2,8,5,-1] res=[] a.依次迭代列表中每一个项 for x in data: if >=0: res.append(x) ...
- 18个Python高效编程技巧,Mark!
初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了.高级语言,如果做 ...
随机推荐
- java主方法组成分析
public static void main(String args[]) public :是一种访问权限,主方法是一切的开始点,开始点一定是公共的 static :表示此方法可由类直接调用 voi ...
- Win10使用自带功能创建系统映像备份时D盘被包含进去问题的解决
在使用Windows10系统时,使用Windows自带功能创建系统映像备份文件时碰到了一些问题,所以在此记录一下. 创建系统映像文件的步骤,如下: 1.打开 控制面板 -> 选择 系统和安全 - ...
- 【监控实践】【4.2】perfmon监控性能计数器(基于typeperf命令)
关键词:typeperf typeperf 命令 使用示例: 案例1:#使用typeperf收集windows cpu.内存.硬盘性能 #使用typeperf收集windows cpu.内存.硬盘性能 ...
- (3.4)常用知识-char与varchar的选择
1.char与varchar的比较 (1)数据存储开销 [1]varchar列需要2个额外的字节来记录存储数据的长度 [2]每个可为null的char列,需要一些字节(空位图)来反应数据的为空性 [3 ...
- JetBrains下载历史版本
https://www.jetbrains.com/clion/download/other.html 在上方的链接中将clion改为idea,phpstrom.webstrom等等
- 【ES6】迭代器与可迭代对象
ES6 新的数组方法.集合.for-of 循环.展开运算符(...)甚至异步编程都依赖于迭代器(Iterator )实现.本文会详解 ES6 的迭代器与生成器,并进一步挖掘可迭代对象的内部原理与使用方 ...
- react 前端项目技术选型、开发工具、周边生态
react 前端项目技术选型.开发工具.周边生态 声明:这不是一篇介绍 React 基础知识的文章,需要熟悉 React 相关知识 主架构:react, react-router, redux, re ...
- SCUT - 216 - 宝华科技树
https://scut.online/p/216 演员 把这个当成dp算了半天,各种姿势,好吧,就当练习一下树dp. 假如是每个节点的层数之和,按照dp[i][j]为从i点出发获得j科技的最小费用d ...
- 自我笔记,Rides介绍
Redis是一个key-value存储系统,和Memccached类似,支持存储的value类型相对更多,很大程度上补偿memcached这类key-value存储的不足 他提供了Java,c/c++ ...
- wordpress数据库结构以及数据表之间的关系
默认WordPress一共有以下11个表.这里加上了默认的表前缀 wp_ . wp_commentmeta:存储评论的元数据 wp_comments:存储评论 wp_links:存储友情链接(Blog ...