[英]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.