2016-12-24 130 views
4

我不能找出如何寫這個函數的拉姆達的,因爲雙條件:過濾功能任意嵌套列表

def f(e): 
    if not isinstance(e,list): 
     if e >10: 
      return e 
    else: 
     return filter(None,[f(y) for y in e]) 
my_list=[[1], [2,[3,12, [4,11,12]]], [5,6,13,14],[15]] 

>>> f(my_list) 
[[[12, [11, 12]]], [13, 14], [15]] 

而且,會是怎樣的Python的方式寫這樣一個過濾任意嵌套列表的函數?

+1

你想'None'在其中'e'不是'list'和'ē<= 10'的情況下被退回?此外,比雙重條件更嚴重的是函數的遞歸性質。當函數沒有名字要調用時,你期望如何遞歸? –

+7

「寫這樣一個函數的pythonic方式是什麼」 - 不是lambda? –

+0

@RoryDaulton不,所以我不得不將它過濾出來 – user2314737

回答

5

首先,通過def將過濾或映射函數定義爲常規函數沒有問題,如果這對可讀性有益 - 請記住"Readability counts" and "Sparse is better than dense"。僅僅因爲語言中有嵌入lambda函數,並不意味着你必須將自己的邏輯壓入其中。

因爲你最終要建立一個任意名單深度通用的解決方案,你可以遞歸通過map() + filter()應用過濾功能刪除None值:

def filter_function(e): 
    if isinstance(e, list): 
     return filter(None, map(filter_function, e)) 
    elif e > 10: 
     return e 

my_list = list(filter_function(my_list)) 

注意list()會需要在Python 3.x上,因爲filter() does not return a list


演示:

>>> my_list = [[1], [2, [3, 12, [4, 11, 12]]], [5, 6, 13, 14], [15]] 
>>> 
>>> def filter_function(e): 
...  if isinstance(e, list): 
...   return filter(None, map(filter_function, e)) 
...  elif e > 10: 
...   return e 
... 
>>> 
>>> print(list(filter_function(my_list))) 
[[[12, [11, 12]]], [13, 14], [15]] 
2

那麼,這是不是最好的做法,但你可以創建一個lambda函數:使用括號組條件:

f = lambda e: filter(None, [f(y) for y in e]) if isinstance(e, list) else (e if e > 10 else None) 

my_list = [[1], [2, [3, 12, [4, 11, 12]]], [5, 6, 13, 14], [15]] 

>>> f(my_list) 
[[[12, [11, 12]]], [13, 14], [15]] 

爲Python 3個用戶:

f = lambda e: list(filter(None, [f(y) for y in e])) if isinstance(e, list) else (e if e > 10 else None)