2011-09-21 66 views
3

是否可以將以下內容轉換爲列表理解?嘗試/列表理解除外

cleaned_list = [] 
for item in dirtry_list: 
    try: 
     item.video 
    except Video.DoesNotExist: 
     pass 
    else: 
     cleaned_list.append(item) 
+2

毫無疑問,是一個令人費解的列表理解,將複製這一點,但爲什麼你想從上面改變嗎? –

+0

當然python中的'filter'函數是從一個髒列表創建一個乾淨列表的正確範例?清潔=過濾器(功能,髒)。然後只需編寫你的功能。 – Spacedman

回答

9

因爲,根據你的其他問題,你使用Django,只是檢查actual field

cleaned_list = [item for item in dirty_list if item.video_id is not None] 
+0

'cleaned_list = [項目在dirty_list中,如果不是item.video_id]'? – MFB

+1

@MFB:在沒有ID可以是0的情況下,是的。 –

10

您不能將try:語句放在列表理解中。 Generators對於更復雜的列表處理存在:

def clean(lst): 
    for item in lst: 
     try: 
      item.video 
     except Video.DoesNotExist: 
      pass 
     else: 
      yield item 

cleaned_list = clean(dirty_list) 
+0

這是否返回一個列表或迭代器?你需要'[x for clean(dirty_list)]'還是不需要? – LondonRob

+1

@LondonRob:在回答'cleared_list'將是一個迭代器。要獲得一個列表,你可以簡化你的代碼到list(clean(dirty_list))。 – 153957

2

的Python:

cleaned_list = filter(lambda x: hasattr(x, 'video'), dirty_list) 

Django的: 你可以做到以下幾點,如果dirty_list是一個QuerySet

cleaned_list = dirty_list.filter(video__isnull=False)