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)如何在列表,字典, 集合中根据条件筛选数据的更多相关文章

  1. 如何在列表,字典,集合中,根据条件筛选数据 -- Python数据结构与算法相关问题与解决技巧

    实际案例: 1.过滤掉列表 [3,9,-1,10,20,-2..]的负数 2.筛出字典{'LiLei':79,'Jim':88,'Lucy':92...}中值高于90的项 3.筛出集合 {77,89, ...

  2. python基础一 -------如何在列表字典集合中根据条件筛选数据

    如何在列表字典集合中根据条件筛选数据 一:列表 先随机生成一个列表,过滤掉负数 1,普通for循环迭代判断 2,filter()函数判断,filter(函数,list|tuple|string) fi ...

  3. Python高效编程技巧实战 实战编程+面试典型问题 中高阶程序员过渡

    下载链接:https://www.yinxiangit.com/603.html 目录:   如果你想用python从事多个领域的开发工作,且有一些python基础, 想进一步提高python应用能力 ...

  4. python数据结构-如何在列表、字典、集合中根据条件筛选数据

    如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...

  5. python 学习笔记(一):在列表、字典、集合中根据条件筛选数据

    一.在列表中筛选数据 在列表中筛选出大于等于零的数据,一般通用的用法代码如下: data = [3, -9, 0, 1, -6, 3, -2, 8, -6] #要筛选的原始数据列表 result = ...

  6. python3编程技巧二——如何在列表、字典、集合 中根据条件筛选数据

    一.列表筛选数据 # coding=utf-8 from random import randint # 创建随机列表 l = [randint(-10, 10) for i in range(10) ...

  7. python基础===如何在列表,字典,集合中根据条件筛选数据

    #常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...

  8. Py小技巧一:在列表,字典,集合中根据条件筛选数据

    1.过滤掉列表中的某些项---列表解析 data=[1,4,2,8,5,-1] res=[] a.依次迭代列表中每一个项 for x in data: if >=0: res.append(x) ...

  9. 18个Python高效编程技巧,Mark!

    初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了.高级语言,如果做 ...

随机推荐

  1. [DS+Algo] 006 两种简单排序及其代码实现

    目录 1. 快速排序 QuickSort 1.1 步骤 1.2 性能分析 1.3 Python 代码示例 2. 归并排序 MergeSort 2.1 步骤 2.2 性能分析 2.3 Python 代码 ...

  2. Codeforces 1255E Send Boxes to Alice(前缀和+枚举+数论)

    我们考虑前缀和sum[i],如果将a[i+1]中的一个塞入a[i]中,则不影响sum[i+1],但是sum[i]++,如果将a[i]中的一个塞入a[i+1],则不影响sum[i+1],但是sum[i] ...

  3. 使用JavaScript获取url中的参数值

    今天需要用到从url中获取参数,在网上找了几个JavaScript方法,mark下来.   一些可以使用的去获取url中指定的部分:如http://www.mystuff.com.cn/aboutus ...

  4. [LeetCode] 45. 跳跃游戏 II

    题目链接 : https://leetcode-cn.com/problems/jump-game-ii/ 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位 ...

  5. 剑指offer-二叉树的镜像-python

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  6. Git 使用疑问

    1)  fatal: remote origin already exists. 解决办法 ..$ git remote add origin git@git.*.com:tang/comment_s ...

  7. tomcat 启动报错 解决办法 A child container failed during&nbsp

    转自:http://blog.sina.com.cn/s/blog_4e1e357d0102v55c.html 控制台报错: Caused by: org.apache.catalina.Lifecy ...

  8. python3中编码与解码的问题

    python3中编码与解码的问题 ASCII .Unicode.UTF-8 ASCII 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此 ...

  9. iOS手势操作,拖动,轻击,捏合,旋转,长按,自定义(http://www.cnblogs.com/huangjianwu/p/4675648.html)

    1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureReco ...

  10. Spring基础02——Spring HelloWorld

    1.首先我们来创建一个HelloWorld类,通过Spring来对这个类进行实例化 package com.wzy.lesson1; /** * @author wzy * @version 1.0 ...