2017-08-17 50 views
-2

我幾乎從在線文檔中給出的例子複製,但在基於Windows的Python 3中使用filter()讓我感到困惑。什麼錯在這裏是:在Python中使用過濾器3

a=[1,2,3,4]  
b=[1,0,1,0]  
f=filter(b,a)  
for fs in f : print(fs) 

... 

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

f=list(filter(b,a)) 

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

在線文檔說扔在list(),但清楚地幫助沒有。

+1

你期望得到什麼結果?請注意,「過濾器」與「在這兩個列表中查找這些列表中的元素」不同。「 – Kevin

+1

您指的是哪些在線文檔? [官方文檔](https://docs.python.org/3/library/functions.html#filter)不會說「要拋出list()in」。 – unutbu

+1

你指的是哪些在線文檔? 'b'意在表示你想要和不想要的'a'中的哪些值,即''b'是'a'上的一個掩模? – AChampion

回答

1

filter的第一個參數必須是函數或lambda。你通過了b這是一個列表。

+0

不是'lambda'函數(匿名)? – AChampion

+0

@AChampion是的。我單獨提到它只是爲了強調它。 – haccks

1

您是誤解如何filter工作,filter需要一個函數,返回True爲每個項目,你想保留。

我假設b介紹a您要選擇的東西,那麼你的意思是像::

f = filter(lambda x: x[1], zip(a, b)) 
for fs, _ in f: ... 

您也可以替換filter與列表理解:

f = [x for x, y in zip(a, b) if y] 
for fs in f: ... 

itertools中有一個功能就是這樣做的:

import itertools as it 
f = it.compress(a, b) 
for fs in f: ... 
0

基本上濾波器需要一個功能和一個可迭代值來過濾

a = [1,2,3,4] 
b = [1,0,1,0] 
f = filter(lambda val: val not in b, a) 
for fs in f: print(fs) 

輸出:當我們調用濾波器與無

list(filter(None, [0,1,2])) 
# This returns [1,2] Which is a special case 
# and it is not equal to: 
list(filter(1, [0,1,2])) #invalid 

的原因是當發生

2 
3 
4 

混亂我們通過篩選條件爲None篩選函數檢查列表中的每個值並查看它們是否符合if value條件。

這大致意味着這一點。

[value for value in [0,1,2] if value] 
+0

這正是我需要理解的。我總是好奇Python爲什麼不提供「明顯」的解決方案作爲基礎案例,而更復雜的案例是爲了更豐富的案例......在這種情況下,我認爲(我看到很多錯誤的例子)過濾器([1,0,1,0],[2,4,6,8])應該返回一個列表(或者在Python中爲三個生成器),它返回(適當的版本)2和6作爲答案 - 即面膜。 – eSurfsnake

+0

如果我打電話,'過濾器'只會使用一個掩碼,而一些名爲ffilter或某些類似的東西會需要lambda ... lambda看起來像是不必要的擊鍵,不必要的函數調用以及buggy /加密的代碼。 – eSurfsnake

+0

@eSurfsnake不確定過濾器API的設計原因。但無論如何,很高興我可以澄清問題:)。請考慮upvote或tick,如果答案有幫助:) –

1

過濾器的文檔明確指出它需要一個函數和一個迭代器作爲輸入。或許,如果你想檢查的值是a和b,你可以這樣做:

f = filter(lambda x: x in b, a) 

,然後遍歷F。