Python過濾序列元素的方法

2022-10-03 09:42:10 字數 2567 閱讀 5009

問題

你有乙個資料序列,想利用一些規則從中提取出需要的值或者是縮短序列

解決方案

最簡單的過濾序列元素的方法就是使用列表推導。比如:

>>> 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]

>>>

使用列表推導的乙個潛在缺陷就是如果輸入非常大的時候會產生乙個非常大的結果集,占用大量記憶體。 如果你對記憶體比較敏感,那麼你可以使用生成器表示式迭代產生過濾的元素。比如:

>>> pos = (n for n in mylist if n > 0)

>>> pos

at 0x1006a0eb0>

>>> for x 程式設計客棧in pos:

... print(x)

...1410

23>>>

有時候,過濾規則比較複雜,不能簡程式設計客棧單的在列表推導或者生成器表示式中表達出來。 比如,假設過濾的時候需要處理一些異常或者其他複雜情況。這時候你可以將過濾**放到乙個函式中, 然後使用內建的 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() 函式建立了www.cppcns.com乙個迭代器,因此如果你想得到乙個列表的話,就得像示例那樣使用 list() 去轉換。

討論列表推導和生成器表示式通常情況下是過濾資料最簡單的方式。 其實它們還能在過濾的時候轉換資料。比如:

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

>>> import math

>>> [math.sqrt(n) for n in mylist if n > 0]

[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]

>>>

過濾操作的乙個變種就是將不符合條件的值用新的值代替,而不是丟棄它們。 比如,在一列資料中你可能不僅想找到正數,而且還想將不是正數的數替換成指定的數。 通過將過濾條件放到條件表示式中去,可以很容易的解決這個問題,就像這樣:

>>> clip_neg = [n if n > 0 else 0 for n in mylist]

>>> clip_neg

[1, 4, 0, 10, 0, 2, 3, 0]

>>> clip_pos = [n if n < 0 else 0 for n in mylist]

>>> clip_pos

[0, 0, -5, 0, -7, 0, 0, -1]

>>>

另外乙個值得關注的過濾工具就是itertools.compress(), 它以乙個iterable物件和乙個相對應的boolean選擇器序列作為輸入引數。 然後輸出iterable物件中對應選擇器為true的元素。 當你需要用另外乙個相關聯的序列來過濾某個序列的時候,這個函式是非常有用的。 比如,假如現在你有下面兩列資料:

addresses = [

'5412 n clark'www.cppcns.com,

'5148 n clark',

'5800 e 58th',

'2122 n cl',

'5645 n r**enswood',

'1060 w addison',

'4801 n broadway',

'1039 w granville',

]counts = [ 0, 3, 10, 4, 1, 7, 6, 1]

現在你想將那些對應count值大於5的位址全部輸出,那麼你可以這樣做:

>>> from itertools import compress

>>> more5 = [n > 5 for n in counts]

>>> more5

[false, false, true, false, false, true, true, false]

>>> list(compress(addresses, more5))

['5800 e 58th', '1060 w addison', '4801 n broadway']

>>>

這裡的關鍵點在於先建立乙個boolean序列,指示哪些元素符合條件。 然後compress()函式根據這個序列去選擇輸出對應位置為true的元素。

和filter()函式類似,compress()也是返回的乙個迭代器。因此,如果你需要得到乙個列表, 那麼你需要使用list()來將結果轉換為列表型別。

Python 過濾元素的迭代函式filter

在python內建函式中,有乙個和map 函式用法類似 卻可以用來過濾元素的迭代函式,這個函式就是filter 它會把列表中有序資料的每乙個元素逐一提供給布林型別的形參函式進行處理,再根據處理結果的真假 true或false 來決定這個元素是否形成新的列表元素。1 示例 import sympy a...

Python 序列的方法

在快速教程中,我們了解了最基本的序列 sequence 回憶一下,序列包含有定值表 tuple 和表 list 此外,字串 string 是一種特殊的定值表。表的元素可以更改,定值表一旦建立,其元素不可更改。任何的序列都可以引用其中的元素 item 下面的內建函式 built in function...

jquery中實現元素過濾的方法集合

三個最基本的過濾方法是 first last 和 eq 它們允許您基於其在一組元素中的位置來選擇乙個特定的元素。其他過濾方法,比如 filter 和 not 允許您選取匹配或不匹配某項指定標準的元素。jquery first 方法 first 方法返回被選元素的首個元素。下面的例子選取首個 元素內部...