筛选序列中的元素 --列表推导式、生成器表达式、filter()以及itertools.compress()

问题:根据指定条件筛选或删除序列中的一些元素

方法1:列表推导式

mylist = [1, 4, -5, 10, -7, 2, 3, -1]

[n for n in mylist if n>0]
Out[3]: [1, 4, 10, 2, 3]

import math
[math.sqrt(n) for n in mylist if n>0]   # 对数据做转换
Out[6]: [1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]

[n if n>0 else 0 for n in mylist]  # 筛选条件移到一个条件表达式
Out[7]: [1, 4, 0, 10, 0, 2, 3, 0]

[n for n in mylist if n>0 else 0]  # 错误写法❌
  File "<ipython-input-8-8e29d951d73d>", line 1
    [n for n in mylist if n>0 else 0]
                                 ^
SyntaxError: invalid syntax  

方法2:使用列表推导式的缺点是如果原始输入非常大的话,这么做可能会产生一个庞大的结果;因此可以使用生成器表达式通过迭代的方式产生筛选数据

pos = (n for n in mylist if n>0)
print(pos)  # 返回一个生成器对象
Out: <generator object <genexpr> at 0x10d5ee780>
#  通过迭代的方式产生筛选数据
for p in pos:  
    print(p)
1
4
10
2
3

方法3:假如筛选过程涉及异常或者其他一些复杂的细节,可以将处理筛选逻辑的代码放到单独的函数中,然后使用内建的filter()函数处理

values = ['1', '2', '-3', '-', 'N/A', '5']
def is_int(val):
    try:
        x = int(val)
        return True
    except ValueError:
        return False
ivals = list(filter(is_int, values))  # filter()创建了一个迭代器,因此可以转换成list形式的结果
ivals
Out[11]: ['1', '2', '-3', '5']

方法4:使用itertools.compress(),接受一个可迭代对象以及一个布尔选择器序列作为输入;输出时,它会给出所有在相应布尔选择器中为True的可迭代对象元素

使用场景:如果想把对一个序列的筛选结果施加到另一个相关的序列上时,就会非常有用
address = ['shanghai', 'nanjing', 'shandong']
counts = [0, 1, 8]
# 想要构建一个地址列表,其中相应的count值要大于5
import itertools
more5 = [n>5 for n in counts]  # 返回一个布尔序列
more5
Out[13]: [False, False, True]
list(itertools.compress(address, more5))  # compress()创建了一个迭代器,因此可以转换成list形式的结果
Out[14]: ['shandong']
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值