小编典典

如何根据条件拆分列表?

all

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

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]

阅读 68

收藏
2022-04-07

共1个答案

小编典典

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
2022-04-07