Python学习路线实用技法:筛选序列中的元素

  

     

  

  序列中含有一些数据,我们需要提取其中的值或根据某些标准对序列做删减,   

  

  要筛选序列中的数据,通常最简单的方法是使用列表推导式。   

  

  例如:   

  <前>   myList=(1、4、5、10、7、2、3、1]   打印([n  for  n 拷贝myList  if  n> 0])   打印([n  for  n 拷贝myList  if  n<0])   之前   

  结果:   

  <前>   (1,4,,,,2,,3]   (5,7日,1]   之前   

  使用列表推导式的一个潜在缺点是如果原始输入非常大的话,这么做可能会产生一个庞大的结果。如果这是你需要考虑的问题,那么可以使用生成器表达式通过迭代的方法产生筛选结果,例如:   

  <前>   myList=(1、4、5、10、7、2、3、1]   pos=(n  for  n 拷贝myList  if  n 在0)   for  x  pos拷贝:   ,打印(x)   之前   

  结果:   

  <前>   1   4   10   2   3.   之前   

  有时候筛选的标准没法简单地表示在列表推导式或生成器表达式中,比如:假设筛选过程涉及异常处理或者其他一些复杂的细节。可以将处理筛选逻辑的代码放到单独的函数中,然后使用内建的过滤器()函数处理,示例如下:   

  <前>   值=[& # 39;1 & # 39;& # 39;2 & # 39;,& # 39;3 & # 39;,& # 39;& # 39;,& # 39;4 & # 39;,& # 39;N/一个# 39;,& # 39;5 & # 39;】   def  is_int (val):   ,试一试:   ,x=int (val)   return 真正的   ,except  ValueError:   return 假   ivals=列表(过滤器(is_int、价值观))   打印(ivals)   之前   

  结果:   

  <前>   [& # 39;1 & # 39;,,& # 39;2 & # 39;,,& # 39;3 & # 39;,,& # 39;4 & # 39;,,& # 39;5 & # 39;】   之前   

  filter()创建了一个迭代器,因此如果我们想要的是列表形式的结果,请确保加上了名单(),就像示例中那样。   

      Python学习路线实用技法:筛选序列中的元素”>
  <p>
  </p>
  
  <h3>
  分析
  </h3>
  <p>
  列表推导式和生成器表达式通常是用来筛选数据的最简单和最直接的方式。此外,它们也具有同时对数据做转换的能力,例如:
  </p>
  <前>
  import 数学
  myList=(1、4、5、10、7、2、3、1]
  打印([math.sqrt (n), for  n 拷贝myList  if  n> 0])
  </>之前
  <p>
  结果:
  </p>
  <前>
  (1.0,2.0,3.1622776601683795,1.4142135623730951,1.7320508075688772)
  </>之前
  <p>
  关于筛选数据,有一种情况是用新值替换掉不满足标准的值,而不是抛弃它们。例如。除了要找到正整数之外,我们也希望在指定范围内将不满足要求的值替换掉。通常,这可以通过将筛选条件迁移到一个条件表达式中来轻松实现,就像下面这样:
  </p>
  <前>
  myList=(1、4、5、10、7、2、3、1]
  打印([n  if  n> 0, else  0, for  n 拷贝myList])
  打印([n  if  n<0, else  0, for  n 拷贝myList])
  </>之前
  <p>
  结果:
  </p>
  <前>
  (1,4,0,10日,0,,2,,3,,0]
  (0,0,5日,0,,7日,0,0,1]
  </>之前
  <p>
  另一个值得一提的筛选工具是itertools.compress(),它接受一个可迭代对象以及一个布尔选择器序列作为输入。输出时,它会给出所有在相应的布尔选择器中为真正的可迭代对象元素。如果想把对一个序列的筛选结果施加到另一个相关的序列上时,这就会非常有用。
  </p>
  <p>
  例如:
  </p>
  <前>
  得到itertools  import 压缩
  地址=[
  & # 39;5412,N  CLARK1& # 39;
  & # 39;5148,N  CLARK2& # 39;
  & # 39;5800,E  CLARK3& # 39;
  & # 39;2122,N  CLARK4& # 39;
  & # 39;5645,M  CLARK5& # 39;
  & # 39;1060,W  CLARK6& # 39;
  ]
  数量=[0、3、10、4、1、7]
  #构建一个列的表,它相应的计算值要大于5
  more5=[n> 5, for  n 拷贝数)
  打印(more5)
  print(列表(压缩(地址、more5)))
  </>之前
  <p>
  结果:
  </p>
  <前>
  假的假的,,,,真的,,假的,,假的,,真的)
  [& # 39;5800,E  CLARK3& # 39;,, & # 39; 1060年,W  CLARK6& # 39;】
  </>之前
  <p>
  这里的关键在于首先创建一个布尔序列,用来表示哪个元素可满足我们的条件,然后压缩()函数挑选出满足布尔值为True的相应元素。
  <h2 class=Python学习路线实用技法:筛选序列中的元素