[关闭]
@yanglt7 2018-12-03T02:31:30.000000Z 字数 1769 阅读 597

Python12_filter and sorted

Python


filter

Python内建的filter()函数用于过滤序列。

和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

  1. >>> def is_odd(n):
  2. ... return n%2 == 1
  3. ...
  4. >>> list(filter(is_odd,[1,2,4,5,6,9,10,15]))
  5. [1, 5, 9, 15]

把一个序列中的空字符串删掉,可以这么写:

  1. >>> def not_empty(s):
  2. ... return s and s.strip()
  3. ...
  4. >>> list(filter(not_empty,['A',',','B',None,'C',' ']))
  5. ['A', ',', 'B', 'C']

注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

用filter求素数

计算素数的一个方法是埃氏筛法

用Python来实现这个算法

  1. def _odd_iter():
  2. n=1
  3. while True:
  4. n=n+2
  5. yield n
  6. def _not_divisible(n):
  7. return lambda x:x%n>0
  8. def primes():
  9. yield 2
  10. it = _odd_iter()
  11. while True:
  12. n=next(it)
  13. yield n
  14. it = filter(_not_divisible(n),it)
  15. for n in primes():
  16. if n <1000:
  17. print(n)
  18. else:
  19. break

sorted

排序算法
Python内置的sorted()函数就可以对list进行排序:

  1. >>> sorted([36,5,-12,9,-21])
  2. [-21, -12, 5, 9, 36]

此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

  1. >>> sorted([36,5,-12,9,-21],key=abs)
  2. [5, 9, -12, -21, 36]

默认情况下,对字符串排序,是按照ASCII的大小比较的:

  1. >>> sorted(['Bob','about','Zoo','Credit'])
  2. ['Bob', 'Credit', 'Zoo', 'about']

给sorted传入key函数,即可实现忽略大小写的排序:

  1. >>> sorted(['Bob','about','Zoo','Credit'],key=str.lower)
  2. ['about', 'Bob', 'Credit', 'Zoo']

要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True:

  1. >>> sorted(['Bob','about','Zoo','Credit'],key=str.lower,reverse=True)
  2. ['Zoo', 'Credit', 'Bob', 'about']

假设我们用一组tuple表示学生名字和成绩:

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()对上述列表分别按名字排序:

  1. >>> def by_name(t):
  2. ... return t[0]
  3. ...
  4. >>> L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)]
  5. >>> L2=sorted(L,key = by_name)
  6. >>> L2
  7. [('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]

再按成绩从高到低排序:

  1. >>> def by_score(t):
  2. ... return t[1]
  3. ...
  4. >>> L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)]
  5. >>> L2=sorted(L,key=by_score,reverse=True)
  6. >>> L2
  7. [('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注