美文网首页慕课网实战学习笔记编程语言爱好者程序员
如何在列表、字典和集合中根据条件筛选数据

如何在列表、字典和集合中根据条件筛选数据

作者: SmallRookie | 来源:发表于2017-07-20 02:39 被阅读99次
实际案例

在实际开发过程中,常常遇到如下几种情况:

  • 过滤掉列表[3, 9, -1, 10, 20, -2, ...]中的负数;
  • 筛选出字典{‘Jack’:79, 'Jim':88, 'Lucy':92, ...}中值高于90的键值对;
  • 筛选出集合{77, 89, 32, 20, ...}中能被3整除的元素。

故应学会在列表、字典和集合中根据条件筛选数据。

1. 列表

通常我们会采用如下代码进行筛选:

data = [1, 5, -3, -2, 6, 0, 9]
res = []
for x in data:
    if x >= 0:
        res.append(x)
print res

对此,我们可以使用Python中的filter(),具体做法如下:

# -*- coding: utf-8 -*-

from random import randint

# 通过randint()随机生成含有10个int类型元素的list,且其元素范围为[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]

print data

# 通过filter()过滤掉负数,并将其最终结果打印
print filter(lambda x: x >= 0, data)

除此之外,我们还能使用列表解析过滤掉列表中的负数。

# -*- coding: utf-8 -*-

from random import randint

# 通过randint()随机生成含有10个int类型元素的list,且其元素范围为[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]

print data

# 通过列表解析过滤掉负数,并将其最终结果打印
print [x for x in data if x >= 0]

这时,我们可能会有一个疑问既然这三种方法都可以成功过滤掉列表中的负数,那哪一种方法效率更高呢?这里,我们可以使用timeit这个计时工具模块,分别测试三种方法的运行时间。其中,我们不妨将第一种方法命名为CommReNeg(),第二种方法命名为FiltReNeg(),第三种方法命名为ListReNeg(),具体代码如下:

# -*- coding: utf-8 -*-

from random import randint
import timeit

# 通过randint()随机生成含有10个int类型元素的list,且其元素范围为[-10, 10]
data = [randint(-10, 10) for _ in xrange(10)]

def CommReNeg():
    res = []
    for x in data:
        if x >= 0:
            res.append(x)
    print res

def FiltReNeg():
    # 通过filter()过滤掉负数,并将其最终结果打印
    print filter(lambda x: x >= 0, data)

def ListReNeg():
    # 通过列表解析过滤掉负数,并将其最终结果打印
    print [x for x in data if x >= 0]

if __name__ == '__main__':
    print (timeit.timeit("CommReNeg()", setup="from __main__ import CommReNeg", number=1))
    print (timeit.timeit("FiltReNeg()", setup="from __main__ import FiltReNeg", number=1))
    print (timeit.timeit("ListReNeg()", setup="from __main__ import ListReNeg", number=1))

其运行结果如图所示:

[3, 3, 6, 6, 4]
0.00333480301869
[3, 3, 6, 6, 4]
0.00176789890732
[3, 3, 6, 6, 4]
0.00172641700262

从图中可以看出第三种方法运行最快,因此推荐使用第三种方法根据条件筛选数据。

2. 字典

既然在列表中已经分析出,采用列表解析运行速度最快,故在此处采用类似于列表解析的方法过滤掉字典中我们不想要的键值对,具体操作如下:

# -*- coding: utf-8 -*-

from random import randint

# 随机生成含有20个键值对的字典
d = {x: randint(60, 100) for x in xrange(1, 21)}

print d

# 通过类似于列表解析的方法过滤掉值小于90的键值对
print {k: v for k, v in d.iteritems() if v > 90}
3. 集合

在列表和字典中,都可以采用同一种方式过滤掉我们不想要的值,那么在集合中是否也可以采用呢?答案当然是可以的,那具体操作如下:

# -*- coding: utf-8 -*-

from random import randint

data = [randint(-10, 10) for _ in xrange(10)]

# 将list转为集合
s = set(data)

print {x for x in s if x%3 == 0}

相关文章

  • Python之集合筛选

    如何在列表,字典,集合中根据条件筛选 核心:使用生成式 列表: 生成随机列表: 筛选方法: 字典: 生成字典: 筛...

  • Python 进阶(上)

    1、如何在列表、字典、集合中根据条件筛选数据? 列表 字典 集合 2、如何为元组中的每个元素命名,提高程序可读性?...

  • python进阶:第一章(数据结构与算法)

    问题一:如何在列表,字典,集合中根据条件筛选数据? 问题内容:如何找出列表中的负数?如何筛选出字典中值大于某个数值...

  • chapter one

    如何在列表,字典,集合中根据条件筛选数据 过滤掉列表中的负数 timeit 列表解析更快都远快于跌代方案 筛出集合...

  • python高级编程技巧(1)

    一. 如何在列表、字典、集合中根据条件筛选数据 实际案例: 过滤掉列表[3,6,7,9,-1,-2,...]中的负...

  • 第1章数据结构与算法

    1-1 如何在列表, 字典, 集合中根据条件筛选数据 实际案例1)过滤掉列表[3,9,-1,10,20,-2…]中...

  • Python 50问 [1]:如何在列表、字典、集合中根据条件筛

    通用解法:迭代 如何在列表、字典、集合中根据条件筛选数据?通常我们的做法是使用迭代。 例如针对下面的列表,我们要筛...

  • python在可迭代对象(列表、字典、集合)中根据条件过滤数据

    在列表,字典,集合中根据条件筛选数据 在可迭代对象中根据条件过滤数据,最常用的方法就是使用循环判断、列表推导式、高...

  • Python高效编程(一)

    实际编程和面试都会遇到的典型问题。 如何在列表,字典,集合中根据条件筛选数据 如何为元组中每个元素命名,提高程序的...

  • 案例式精讲python开发技巧

    第二章 数据结构相关话题 1、如何在列表、字典、集合中根据条件筛选数据 2、如何给元组中的每个元素命名,提高程序可...

网友评论

  • MingSha:挺棒的。:smile:
    SmallRookie:@love鸣沙 谢谢 不过这个课程后面实在不怎么样:joy:

本文标题:如何在列表、字典和集合中根据条件筛选数据

本文链接:https://www.haomeiwen.com/subject/dworkxtx.html