过滤序列元素

1. 有一个数据序列,想提取出需要的值或者是缩短序列,最简单的方式就是使用列表推导

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

- 缺陷就是结果集非常大时会长用大量的内存

2.那么就可以使用生成器表达式迭代产生过滤的元素

pos = (n for n in mylist if n>0)
print(pos) #<generator object <genexpr> at 0x000001CEF6564048>
for x in pos:
    print(x) #1 4 1 0 2 3

-  filter() 函数创建了一个迭代器,因此如果想得到一个列表的话,就得使用 list()去转换。

复制代码
values = ['1', '2', '-3', '-', '4', 'N/A','5']
import math
def is_int(val):
    try:
        x = int(val)
        return True
    except ValueError:
        return False
ivals = list(filter(is_int,values))
float_num = []
for num in ivals:
    float_num.append(float(num))
print(float_num) #[1.0, 2.0, -3.0, 4.0, 5.0]
复制代码

3. 在过滤数据的时候还可以转换数据

mylist = [1, 4, -5, 10, -7, 2, 3, -1]
import math
print([math.sqrt(n) for n in mylist if n > 0 ]) ##[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]

- 在过滤操作时,想用指定的数据去代替过滤的值

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

- 当你想过滤掉两个相关联的数据时,itertools.compress()是一个很有用的工具

复制代码
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]
复制代码

- 想要输出counts值大于5的全部地址

cheng = [n > 5 for n in counts]  
#大于5的输出是True,小于5的输出False
print(cheng) #[False, False, True, False, False, True, True, False]

from itertools import compress
more = list(compress(addresses,cheng))
#compress() 函数根据这个序列去选择输出对应位置为 True 的元素
print(more) #['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']

 

posted @   花桥  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示