2016-12-24 29 views
3

我有這樣的名單列表(只有兩個嵌套級別):刪除項目:Python的方式

my_list = [['A'], ['B'], ['C','D','A','B'], ['E'], ['B', 'F', 'G'], ['H']]

我有項目列表中my_list刪除:

to_del = ['A','B']

這是我的代碼主意,my_list刪除to_del元素:

for i in my_list: 
    for d in to_del: 
     if d in i: 
      i.remove(d) 

輸出: [[], [], ['C', 'D'], ['E'], ['F', 'G'], ['H']]

這裏我的問題:

  • 您能否提供一個更Python /優雅的方式做同樣的
  • 您能否提供一個智能的方式來概括的嵌套數級別 例如my_list = [ ['A'], ['B'], ['C', ['D', 'E', ['F']], 'G'], ['H'] ]
  • 理想的方法將有一個布爾參數empty_lists來決定是否保留空列表。
+2

你想保持空列表? – fafl

+0

你已經注意到了。好吧,理想的方法有一個布爾參數'empty_lists'來決定是否讓空列表 – enneppi

+0

歡迎來到[so]。我們有編輯歷史的人對真正感興趣的帖子如何隨着時間的推移而演變,所以不需要輸入「編輯:」。你應該總是整合新的信息,形成一個連貫的帖子,而不是懶惰地標記信息,使帖子難於閱讀。如果你真的需要引起注意,不要吝惜,但使用** bold **或* italics *。 – Anthon

回答

3

對於嵌套列表理解:

[[y for y in x if y not in to_del] for x in my_list] 

隨着列表理解和拉姆達過濾器:

[filter(lambda y: y not in to_del, x) for x in my_list] 

的任意嵌套列表的一般情況下的嘗試:

def f(e): 
    if not isinstance(e,list): 
     if e not in to_del: 
      return e 
    else: 
     return filter(None,[f(y) for y in e]) 

to_del = ['A','B'] 
my_list= [['A'], ['B',['A','Z', ['C','Z','A']]], ['C','D','A','B'],['E'], ['B','F','G'], ['H']] 

>>> f(my_list) 
[[['Z', ['C', 'Z']]], ['C', 'D'], ['E'], ['F', 'G'], ['H']] 
+1

我喜歡它。對於兩個嵌套級別的特殊情況,我解決了:'list(filter(None,[[s for s in sublist if s not in to_del] for sublist in my_list]))''。一個問題:你不應該使用'list(f(my_list))'''f來投射'f',因爲它返回一個迭代器? – enneppi

+0

@Nicola Python 2返回一個列表...看起來該是我切換到Python 3的時候了 – user2314737

6

嘗試列表理解:

my_list = [[x for x in sublist if x not in to_del] for sublist in my_list] 

輸出:

>>> my_list 
[[], [], ['C', 'D'], ['E'], ['F', 'G'], ['H']]