2017-06-05 44 views
0

我想寫一個函數,它接收一個列表和一個數字,並返回另一個列表,其中所有數字除以參數傳遞的數字。例如:如何獲取在Python中使用過濾器函數除以特定數字的數字列表?

filter_list_by_factor([1, 2, 3, 4, 5], 2) 
>>> [2, 4] 

所以我想到了創建一個函數調用is_factor:

def is_factor(a, b): 
    return a % b == 0 

然後,我想調用的函數是這樣的:

def filter_list_by_factor(numbers_list, number): 
    return list(filter(is_factor, numbers_list)) 

但導致這種錯誤:類型錯誤:is_factor()缺少1所需位置參數: 'b'

你們能幫我嗎?

+0

是否有任何理由爲什麼你必須用'filter'做到這一點,而不是一個列表COMPRE hension? –

回答

4

你可以試試這個沒有使用過濾器:

def is_factor(a, b): 
    return [i for i in a if i%b == 0] 


print(is_factor([1, 2, 3, 4, 5], 2)) 
+1

Omg,列表解析非常強大 – flpn

+0

列表解析功能非常強大,節省大量空間。 – Ajax1234

3

您可以使用部分功能來傳遞缺少的參數

from functools import partial 


def is_factor(a, b): 
    return a % b == 0 


def filter_list_by_factor(numbers_list, number): 
    return list(filter(partial(is_factor, b=number), numbers_list)) 

或者你可以捕獲一個lambda

def filter_list_by_factor(numbers_list, number): 
    return list(filter(lambda a: a % number == 0, numbers_list)) 
裏面的東西

但正如其他答案所示,列表理解可能更易於理解。

+0

謝謝你,我喜歡這個lambda解決方案 – flpn

3

你可以用它在lambda或使用functools.partial

def is_factor(a, b): 
    return a % b == 0 

def filter_list_by_factor(numbers_list, number): 
    return list(filter(lambda x: is_factor(x, number), numbers_list)) 

from functools import partial 

def filter_list_by_factor(numbers_list, number): 
    return list(filter(partial(is_factor, b=number), numbers_list)) 
1

過濾器沒有通過第二個參數(這不應該suprising - 在該行的代碼,它從哪裏獲得通過的第二個參數(在你的榜樣「號」)

嘗試使用拉姆達:

def filter_list_by_factor(numbers_list, number): 
    return list(filter(lambda x:is_factor(x,number), numbers_list)) 
相關問題