Python:根据条件拆分列表?

发布于 2021-02-02 23:18:41

从美学角度和性能角度来看,基于条件将项目列表拆分为多个列表的最佳方法是什么?相当于:

good = [x for x in mylist if x in goodvals]
bad  = [x for x in mylist if x not in goodvals]

有没有更优雅的方法可以做到这一点?

更新:这是实际的用例,以更好地解释我正在尝试做的事情:

# files looks like: [ ('file1.jpg', 33L, '.jpg'), ('file2.avi', 999L, '.avi'), ... ]
IMAGE_TYPES = ('.jpg','.jpeg','.gif','.bmp','.png')
images = [f for f in files if f[2].lower() in IMAGE_TYPES]
anims  = [f for f in files if f[2].lower() not in IMAGE_TYPES]
关注者
0
被浏览
97
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。
    good = [x for x in mylist if x in goodvals]
    bad  = [x for x in mylist if x not in goodvals]
    

    有没有更优雅的方法可以做到这一点?

    该代码完全可读,而且非常清晰!

    # files looks like: [ ('file1.jpg', 33L, '.jpg'), ('file2.avi', 999L, '.avi'), ... ]
    IMAGE_TYPES = ('.jpg','.jpeg','.gif','.bmp','.png')
    images = [f for f in files if f[2].lower() in IMAGE_TYPES]
    anims  = [f for f in files if f[2].lower() not in IMAGE_TYPES]
    

    再次,这很好!

    使用集合可能会稍微改善性能,但这是微不足道的差异,而且我发现列表理解要容易阅读得多,并且你不必担心顺序被弄乱了,重复项被删除等等。

    实际上,我可能会“向后”前进另一步,并且只使用一个简单的for循环:

    images, anims = [], []
    
    for f in files:
        if f.lower() in IMAGE_TYPES:
            images.append(f)
        else:
            anims.append(f)
    

    列表理解或使用set()都很好,除非你需要添加其他检查或其他逻辑-说你要删除所有0字节jpeg,只需添加类似内容即可。

    if f[1] == 0:
        continue
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看