天天看點

Python Cookbook 1.16 篩選序列中的元素

找出清單中的正數:

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

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

上面的方法叫做清單推導式,但是如果原始的輸入非常大,可能會産生一個龐大的結果。

如果這是你需要考慮的問題,可以使用生成器表達式通過疊代的方法産生篩選的結果。

(n for n in mylist if n > 0)
Out[49]: <generator object <genexpr> at 0x00000253E4F80780>
           

有時候篩選的條件很複雜,沒辦法在清單推導式中使用,可以将其放到函數裡,然後通過内建函數 filter 來處理:

values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):
    try:
        x = int(val)
        return True
    except:
        return False
   
list(filter(is_int, values))
Out[54]: ['1', '2', '-3', '4', '5']
           

對篩選結果進行處理:

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

import math

[math.sqrt(n) for n in mylist if n > 0]
Out[58]: [1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]
           
[n if n > 0 else 0 for n in mylist]
Out[60]: [1, 4, 0, 10, 0, 2, 3, 0]
           

itertools.compress

這是一個篩選工具,接受一個可疊代對象以及一個布爾選擇器序列作為輸入,輸出時會給出所有在相應的布爾選擇器中為 True 的可疊代對象,作用于把一個序列的篩選結果施加到另一個相關的序列上。

from itertools import compress
morethan3 = [n > 3 for n in counts]
morethan3
Out[65]: [True, False, False, True, False, False]

list(compress(counts, morethan3))
Out[66]: [4, 7]