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

Python: 序列: 過濾序列元素

filter true error 列表 一個數 不能 有一個 內存 一個

問題: 你有一個數據序列,想利用一些規則從中提取出需要的值或者是縮短序列

answer:

eg1:列表推導

最簡單的過濾序列元素的方法就是使用列表推導。比如:
>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]
>>> [n for n in mylist if n > 0]
[1, 4, 10, 2, 3]
>>> [n for n in mylist if n < 0]
[-5, -7, -1]

eg2:生成器表達式叠代

使用列表推導的一個潛在缺陷就是如果輸入非常大的時候會產生一個非常大的結果集,占用大量內存。如果你對內存比較敏感,那麽你可以使用生成器表達式叠代產生

過濾的元素。比如:
>>> pos = (n for n in mylist if n > 0)
>>> pos
<generator object <genexpr> at 0x1006a0eb0>
>>> for x in pos:
... print(x)
...
1

4
10
2

3

eg3: filter()

有時候,過濾規則比較復雜,不能簡單的在列表推導或者生成器表達式中表達出來。比如,過濾的時候需要處理一些異常或者其他復雜情況。可以將過濾代碼放到一個函數中,然後使用內建的filter() 函數

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


>>>def is_int(val):
...  try:
...    x = int(val)
...    return True
...  except ValueError:
...    return False
>>>ivals = list(filter(is_int, values))
>>>print(ivals)
# Outputs [‘1‘, ‘2‘, ‘-3‘, ‘4‘, ‘5‘]
filter() 函數創建了一個叠代器,因此如果你想得到一個列表的話,就得像示例那樣使用list() 去轉換。

Python: 序列: 過濾序列元素