过滤序列中的元素
序列中的數據,經常需要提取特定條件的數據,或減少序列中的數據。
常用的方式是使用列表生成式(list comprehension),如下:
用列表推導的一個潛在缺點是,如果原始輸入很大,它可能會產生大的結果。 如果這是一個問題,可以使用生成器表達式(generator expression)迭代生成過濾值。如下:
>>> pos = (n for n in mylist if n > 0) >>> pos <generator object <genexpr> at 0x10d6a4750> >>> for i in pos: ... print(i) ... 1 4 10 2 3有些時候,過濾條件比價復雜,難以使用簡單的列表生成式或生成器表達式來過濾。比如說,過濾條件涉及到異常的處理或其他更復雜的情形。對于以上情況,我們可以將過濾條件的代碼放在單獨的函數中,然后使用內置的filter()。如下所示:
values = ['1', '2', '-3', '-', '4', 'N/A', '5']def is_int(val):try:x = int(val)return Trueexcept ValueError:return Falseivals = list(filter(is_int, values)) print(ivals) # Outputs ['1', '2', '-3', '4', '5']filter()構造了一個迭代器,可以轉化為list或tuple等。
列表生成式和生成器表達式是最簡單的過濾序列元素的方式,在過濾的同時,也可以進行數據的重新構造和轉換。如下:
過濾的一種變體涉及用新值替換不符合標準的值而不是丟棄它們,如下:
>>> 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_positertools模塊提供了一個compress()函數,也可以用于過濾序列元素。
函數參數為一個迭代器對象,一個Boolean過濾選擇器序列。作為輸出,它提供了其中選擇器中的相應元素為True的那些元素。如果你嘗試將一個序列的過濾結果應用于另一個相關序列,這可能很有用。如下所示:
轉載于:https://www.cnblogs.com/jeffrey-yang/p/11314243.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: Asp默认的上传文件大小限制是200K
- 下一篇: Maven 命令格式及一些常用命令