【python cookbook】【数据结构与算法】16.筛选序列中的元素

问题:提取出序列中的值或者根据某些标准对序列做删减

解决方案:列表推导式、生成器表达式、使用内建的filter()函数

1、列表推导式方法:存在一个潜在的缺点,如果输入数据非常大可能会产生一个庞大的结果,考虑到该问题,建议选择生成器表达式

# Examples of different ways to filter data

mylist = [1, 4, -5, 10, -7, 2, 3, -1]
print(‘mylist=‘,mylist)

# 使用列表推导式
pos = [n for n in mylist if n > 0]
print(‘正数为:‘,pos)

neg = [n for n in mylist if n < 0]
print(‘负数为:‘,neg)
>>> ================================ RESTART ================================
>>>
mylist= [1, 4, -5, 10, -7, 2, 3, -1]
正数为: [1, 4, 10, 2, 3]
负数为: [-5, -7, -1]
>>> 

2、生成器表达式方法:

mylist = [1, 4, -5, 10, -7, 2, 3, -1]
print(‘mylist=‘,mylist)

# 使用生成器表达式
pos = (n for n in mylist if n > 0)
print(‘生成器为‘,pos)

for x in pos:
    print(x)
>>> ================================ RESTART ================================
>>>
mylist= [1, 4, -5, 10, -7, 2, 3, -1]
生成器为 <generator object <genexpr> at 0x02421FD0>
1
4
10
2
3

3、如果筛选标准无法简单表示在列表推导式或者生成器表达式中,比如筛选过程涉及一些异常处理或者更复杂的细节,可以考虑将处理筛选逻辑的代码放到单独的函数中,然后使用内建的filter()函数处理。

values=[‘1‘,‘2‘,‘-3‘,‘-‘,‘N/A‘,‘4‘,‘5‘,‘%‘]

def is_int(val):  #将处理筛选逻辑的代码放到单独的函数
    try:
        x=int(val)
        return True
    except ValueError:
        return False

ivals=list(filter(is_int,values)) #使用filter(func,list)进行过滤
print(ivals)
>>> ================================ RESTART ================================
>>>
[‘1‘, ‘2‘, ‘-3‘, ‘4‘, ‘5‘]
>>> 

filter(func,list)会创建一个迭代器,如果想要列表形式的结果,需使用list()将结果转为列表。

补充:

用新值替换掉不满足标准的值,而不是丢弃它们,可通过将筛选条件移到一个条件表达式中来轻松实现。

# Negative values clipped to 0
neg_clip = [n if n > 0 else 0 for n in mylist]
print(‘负数替换为0,结果:‘,neg_clip)

# Positive values clipped to 0
pos_clip = [n if n < 0 else 0 for n in mylist]
print(‘正数替换为0,结果:‘,pos_clip)
‘‘‘
>>> ================================ RESTART ================================
>>>
mylist= [1, 4, -5, 10, -7, 2, 3, -1]
负数替换为0,结果: [1, 4, 0, 10, 0, 2, 3, 0]
正数替换为0,结果: [0, 0, -5, 0, -7, 0, 0, -1]
>>> 

值得推荐的工具itertools.compress(),它接受一个可迭代对象以及一个布尔选择序列作为输入。

如果想把对一个序列的筛选结果施加到另一个相关的序列上时,就会非常有用。

# 采用筛选工具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]

from itertools import compress

more5 = [ n > 5 for n in counts ]
a = list(compress(addresses, more5))
print(a)
>>> ================================ RESTART ================================
>>>
[‘5800 E 58TH‘, ‘1060 W ADDISON‘, ‘4801 N BROADWAY‘]
>>> 

这里的关键是首先创建一个布尔序列,用来表示哪个元素可满足我们的条件。然后compress()函数挑选出满足布尔值为True的相应元素。

同filter()函数一样,正常情况下compress()函数返回一个迭代器,若需要返回列表则需使用list()将结果转为列表。

时间: 2024-10-11 12:11:03

【python cookbook】【数据结构与算法】16.筛选序列中的元素的相关文章

python 筛选序列中的元素

列表生成式 a = [1, 2, 3, 4, -1, -2] b = [i for i in a if a > 0] 如果数据量很大,会产生一个庞大的结果.这时可以用生成器表达式: b = (i for i in a if a > 0) 如果筛选的过程中涉及一些复杂的细节,可以使用内建的 filter() 函数: values = ['1', '2', '3', 'N/A', '-', 5] def is_int(val): try: x = int(val) return True exce

使有序序列中每个元素最多出现2次的几种算法实现

问题描述(来源:leetcode--Remove Duplicates from Sorted Array II) 对于一个给定的已排序序列,要求实现一个算法:使序列中同一元素出现的次数不超过2次,对超过2次的同一元素直接删除,例如: 输入:给定序列A={1,1,1,2,2,3} 输出:要求返回length =5,A变为{1,1,2,2,3} 一.实现1 1.方式:该实现使用计数count,比较直观,而较容易想到,且扩展性较好,如果想将条件改为:最多出现n次,只需将条件count!=2改为cou

python中的enumerate函数用于遍历序列中的元素以及它们的下标

enumerate 函数用于遍历序列中的元素以及它们的下标: >>> for i,j in enumerate(('a','b','c')): print i,j 0 a1 b2 c>>> for i,j in enumerate([1,2,3]): print i,j 0 11 22 3>>> for i,j in enumerate({'a':1,'b':2}):    #注意字典,只返回KEY值!! print i,j 0 a1 b >&g

38 py改变函数参数的值关键字参数和参数默认值函数中可变参数将序列中的元素值作为函数对应的参数值传

第五课:改变函数参数的值 一个python函数可以有任意多个参数,在一个函数的外部来定义变量,然后把变量作为参数传入到函数内,并且在函数的内部来修改函数的参数值,函数结束之后,这些变量的值在如何变化呢? 给函数传递值有2种:1种是值传递,1种是引用传递 # 改变函数参数的值 # 值传递(数值.字符串.布尔 这些都是值传递) 在函数的内部修改变量值,不改变原参数定义的参数值,解释为: 这个在函数中不会改变原来定义(函数外部)的值 这是因为函数里面会有一个占的概念,外边的变量的值会复制给 占 里面,

Chapter One:数据结构和算法-解压序列赋值给多个变量

一.问题: 现在有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量? 二.解决方案: 代码示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 >>> p = (4, 5) >>> x, y = p >>> x 4 >>> y 5 >>> >>> data = [ 'ACME', 

[0x01 用Python讲解数据结构与算法] 关于数据结构和算法还有编程

忍耐和坚持虽是痛苦的事情,但却能渐渐地为你带来好处. ——奥维德 一.学习目标 · 回顾在计算机科学.编程和问题解决过程中的基本知识: · 理解“抽象”在问题解决过程中的重要作用: · 理解并实现抽象数据结构: · 复习Python编程语言 二.写在前面 自第一台电子计算机使用线路和开关传达人类的指令以来,我们编程的思考方式有了很大的改变,在很多方面,计算机技术的发展为计算机科学家提供了众多的工具和平台去实现他们的想法.高性能理器,高速网络和大内存使得计算机研究者必须掌握在这样复杂的螺旋式通道中

【数据结构和算法16】堆排序

堆排序,顾名思义就是利用堆这个数据结构对数据项进行排序.前面提到过.堆数据结构中.节点大于或等于自己的子节点.那么我们能够将待排序的数据项依次加入到堆中,然后再依次取出根节点就可以.从堆中取出的数据项是从大到小排列的.由于根节点永远是最大的.而堆中永远是取根节点.假设对堆这样的数据结构不太了解的话,能够先看这篇博文:数据结构和算法之 堆.这里不再赘述. 以下我们来看看堆排序的实现(假设程序有不清楚的地方.也能够參考上面那篇博文). public class HeapSort { private

Python实现数据结构和算法之桶排序

桶排序 桶排序从 1956 年就开始被使用,该算法的基本思想是由E.J.Issac 和 R.C.Singleton 提出来的. 这个算法就好比有 11 个桶,编号从 0~10.每出现一个数,就在对应编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子就 OK 了.例如 2 号桶中有 1 个小旗子,表示2 出现了一次;3 号桶中有 1 个小旗子,表示 3 出现了一次;5 号桶中有 2 个小旗子,表示 5出现了两次;8 号桶中有 1 个小旗子,表示 8 出现了一次. 代码 1 def main(

Python实现数据结构和算法之冒泡排序

冒泡排序 冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来. 如果有 n 个数进行排序,只需将 n?1 个数归位,也就是说要进行n-1 趟操作.而“每一趟”都需要从第 1 位开始进行相邻两个数的比较,将较小的一个数放在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一个尚未归位的数,已经归位的数则无需再进行比较. 代码 1 def _bubbleSort(): 2 a = [] 3 n = int(input('您需要输入几个数进行排序