簡體   English   中英

Python 過濾器沒有按預期工作

[英]Python filter doesn't work as expected

我有以下 Python 代碼:

a = [1,2,3,'4','55',6]
filter(int,a)

output 是:

[1, 2, 3, '4', '55', 6]

filter()應該從提供的序列中刪除轉換為 false 的元素,並僅返回那些轉換為 true 的元素。

我預計 output 是:

[1,2,3,6]

因為這些是我列表中唯一的整數。 我錯過了一些重要的東西嗎?

使用isinstance代替:

>>> a =[1,2,3,'4','55',6]
>>> filter(lambda x: isinstance(x, int),a)
[1, 2, 3, 6]

int會將每個對象轉換為整數,並且由於列表中的所有數字/字符串均為非零,因此filter會將其全部選中,因為它們在布爾上下文中的值為True 取而代之的是,您的目標似乎是選擇已經是int且可以使用isinstance完成的對象。

filter()調用iterable中的每一項賦予其( int )的可調用對象,並返回那些為Truthy的對象。 由於int('56')結果為56 ,因此它是Truthy並包含在結果中。 您可能想要這樣的東西:

filter(lambda x: isinstance(x, int), a)

或更好:

[x for x in a if isinstance(x, int)]

我同意@niemmi和@zondo的解決方案,即

filter(lambda x: isinstance(x, int), a)

現在的問題是為什么filter(int,a)不起作用?

過濾器最終調用function(val) ,如果返回false,則將其過濾掉。

>>> int('4')  # Which is returning 4, and its true.
4

但是如果你這樣稱呼

>>> a =[1,2,3,'4','0',6]
>>> filter(int, a)
[1,2,3,4,6]

>>> a =[1,2,3,'4','55a',6]
>>> filter(int, a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55a'

嘗試這個:

[x for x in a if isinstance(x, int)]

要么

filter(lambda x: isinstance(x, int), a)

更長一點的方式:

  • 我們創建一個 function,在其中創建一個子 function。

  • 作為“isins”的第一個 function 將采用稱為內部過濾器即isinstance的 function 作為輸入。

  • 然后代碼看到它正在返回支票function 並將isins(isinstance)替換為支票。

  • 在 child function 內部,有一個明確的“True”和“False”檢查,因為 bool 1 和 0 被視為與 True 和 Flase 相同,因此如果我們刪除這個過濾器,那么列表將包含數字和 bool 值,如果我們放入 bool 過濾器,然后 1 和 0 也將被過濾掉。

  • 最后,我們檢查 func/isinstance 以僅返回那些 int 或 float 的值。

     def isins(func): def check(a): if str(a) not in ('True','False'): return (func(a,(int,float))) return check num_list = list(filter(isins(isinstance),a)) num_list
  • 下面的代碼還允許您顯式輸入數據類型。

     def isins(func,dt): def check(a): if str(a) not in ('True','False'): return (func(a,dt)) return check num_list = list(filter(isins(isinstance,(int,float)),a)) num_list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM