zoukankan      html  css  js  c++  java
  • Python 过滤序列元素


    一、问题

    过滤序列元素



    二、解决方案

    1. 列表推到

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

    列表推到占用内存,可以用生成器表达式代替。


    2. 生成器表达式

    pos = (n for n in lst if n > 0)
    print(pos)
    
    for i in pos:
        print(i)
    

    输出:

    <generator object <genexpr> at 0x0000027741A098C8>
    
    1
    4
    10
    2
    3
    

    过滤规则比较复杂,不能简单的在列表推到或生成器表达式中表达出来,

    可以将过滤代码放到一个函数中,然后使用 filter() 函数。


    3. filter() 函数

    lst = ['1', '2', '3', '-', '4', 'N/A', '5']
    def if_int(val):
        for i in val:
            if i.isdigit():
                return True
            else:
                return False
    result = list(filter(if_int, lst))
    print(result)
    

    输出:

    ['1', '2', '3', '4', '5']
    


    三、讨论

    还有一个过滤工具 itertools.compress()

    以迭代器和布尔选择器作为输入,输出迭代对象中布尔值是 True 的元素。

    name = ['wangke', 'wangyan', 'wangying', 'qinlu', 'hongxia']
    age = [30, 18, 18, 28, 58]
    

    from itertools import compress
    
    more18 = [n>18 for n in age]
    print(more18)
    print(list(compress(name, more18)))     # 输出age>18的name
    

    输出:

    [True, False, False, True, True]
    
    ['wangke', 'qinlu', 'hongxia']
    
  • 相关阅读:
    闭关
    我现在很好
    asp.net看不明白怎么办?
    中秋节
    今天很开心
    偶尔伤感
    现在是10月4日了!
    2006的最后一天
    十多天都不写博客了
    呵呵  最近很忙  但是很充实!
  • 原文地址:https://www.cnblogs.com/keye/p/15633199.html
Copyright © 2011-2022 走看看