zoukankan      html  css  js  c++  java
  • [PY3]——过滤数据——列表推导、filter()、itertools.compress()

    问题

    你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列

    解决方案

    最简单的过滤数据的方法,就是使用列表推导。

    使用列表推导的一个潜在缺陷就是如果输入非常大的时候会产生一个非常大的结果集,对内存敏感时可以考虑使用生成器表达式迭代产生过滤元素

    在过滤规则比较复杂不便于用简单的列表推导就写出来的情况下,这时可以考虑写成将规则写成一个函数,然后使用内建的 filter() 函数

    还有过滤工具 itertools.compress() 

    列表推导

    lst=[1,4,-5,10,-7,2,3,-1]
    print([n for n in lst if n>0])
     [1, 4, 10, 2, 3]
    
    #若考虑内存占用情况,则:
    result=[n for n in lst if n>0]
    for x in result:
        print(x)
     1
     4
     10
     2
     3

    filter(函数,序列)

    filter()接收一个函数和一个序列。

    filter()会把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

    values = ['1', '2', '-3', '-', '4', 'N/A', '5']
    def is_int(val):
        try:
            x=int(val)
            return True
        except ValueError:
            return False
    ivals=list(filter(is_int,values))
    print(ivals)
         ['1', '2', '-3', '4', '5']
    
    # 用filter()删除1~100的素数

    itertools.compress(data,selectors)

    compress 可用于对数据进行筛选,当 selectors 的某个元素为 true 时,则保留 data 对应位置的元素,否则去除

    from itertools import compress
    print(list(compress("ABCDEF",[1,0,1,0,1,1])))
        ['A', 'C', 'E', 'F']
    print(list(compress("ABCDEF",[True,False,True,False,True,True])))
        ['A', 'C', 'E', 'F']
    
    addresses = [
        '5412 N CLARK',
        '5148 N CLARK',
        '5800 E 58TH',
        '2122 N CLARK',
        '5645 N RAVENSWOOD',
        '1060 W ADDISON',
        '4801 N BROADWAY',
        '1039 W GRANVILLE',
    ]
    counts = [0, 3, 10, 4, 1, 7, 6, 1]
    print(list(compress(addresses,[n>5 for n in counts])))
         ['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']

    过滤数据时转换数据

    import math
    print([math.sqrt(n) for n in lst if n>0])
        [1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]

    过滤数据时替换数据

    print([n if n>0 else 0 for n in lst])
        [1, 4, 0, 10, 0, 2, 3, 0]
    print([n if n<0 else '-' for n in lst])
        ['-', '-', -5, '-', -7, '-', '-', -1]

    参考文章

    filter-廖雪峰的网站

    itertools模块介绍-极客学院

  • 相关阅读:
    从零开始学 Web 之 DOM(七)事件冒泡
    从零开始学 Web 之 DOM(六)为元素绑定与解绑事件
    从零开始学 Web 之 DOM(五)元素的创建
    从零开始学 Web 之 DOM(四)节点
    从零开始学 Web 之 DOM(三)innerText与innerHTML、自定义属性
    从零开始学 Web 之 DOM(二)对样式的操作,获取元素的方式
    从零开始学 Web 之 DOM(一)DOM的概念,对标签操作
    @RequestParam和@GetMapping
    组件(一)
    Vue(一)
  • 原文地址:https://www.cnblogs.com/snsdzjlz320/p/7200915.html
Copyright © 2011-2022 走看看