在列表推导式中使用try/except

7

以下内容是否可以转换为列表解析?

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

2
毫无疑问,有一个复杂的列表推导式可以复制这个,但是为什么要改变上面的呢? - David Heffernan
在Python中,“filter”函数肯定是从一个脏列表创建一个干净列表的正确范例,对吧?只需编写您的函数即可。clean = filter(function,dirty)。 - Spacedman
3个回答

15

你不能在列表推导式中放置try:语句。 生成器用于更复杂的列表处理:

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

cleaned_list = clean(dirty_list)

这会返回一个列表还是迭代器?你需要 [x for x in clean(dirty_list)] 吗? - LondonRob
2
@LondonRob:在这个答案中,cleaned_list 将会是一个迭代器。如果你想要得到一个列表,你可以简化你的代码为 list(clean(dirty_list)) - 153957

11

鉴于你在其他问题中使用的是Django,只需检查实际字段即可。

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

cleaned_list = [item for item in dirty_list if not item.video_id] 的翻译如下:cleaned_list = [item for item in dirty_list if not item.video_id] - MFB
1
@MFB:在ID不能为0的情况下,是的。 - Ignacio Vazquez-Abrams

4

Python:

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

Django: 如果dirty_list是一个查询集,您可以执行以下操作

cleaned_list = dirty_list.filter(video__isnull=False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接