1. 程式人生 > 其它 >Python 過濾序列元素

Python 過濾序列元素

目錄

一、問題

過濾序列元素



二、解決方案

1. 列表推到

lst = [1, 4, -5, 10, -7, 2, 3, -1]
print([n for n in lst if n > 0])
# [1, 4, 10, 2, 3]

列表推到佔用記憶體,可以用生成器表示式代替。


2. 生成器表示式

pos = (n for n in lst if n > 0)
print(pos)

for i in pos:
    print(i)

輸出:

<generator object <genexpr> at 0x0000027741A098C8>

1
4
10
2
3

過濾規則比較複雜,不能簡單的在列表推到或生成器表示式中表達出來,

可以將過濾程式碼放到一個函式中,然後使用 filter()函式。


3. filter() 函式

lst = ['1', '2', '3', '-', '4', 'N/A', '5']
def if_int(val):
    for i in val:
        if i.isdigit():
            return True
        else:
            return False
result = list(filter(if_int, lst))
print(result)

輸出:

['1', '2', '3', '4', '5']


三、討論

還有一個過濾工具 itertools.compress()

以迭代器和布林選擇器作為輸入,輸出迭代物件中布林值是 True 的元素。

name = ['wangke', 'wangyan', 'wangying', 'qinlu', 'hongxia']
age = [30, 18, 18, 28, 58]

from itertools import compress

more18 = [n>18 for n in age]
print(more18)
print(list(compress(name, more18)))     # 輸出age>18的name

輸出:

[True, False, False, True, True]

['wangke', 'qinlu', 'hongxia']