2011-09-21 77 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)