Python:根据条件拆分列表?

问题:

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

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]

回答:

有没有更优雅的方式来做到这一点?

该代码完全可读,非常清楚!

# 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]

再次,这是fine!
使用集合可能会有轻微的性能提升,但这是一个微不足道的差异,我发现列表的理解更容易阅读,您不必担心顺序被搞砸,重复被删除如此。
其实我可能会再走一步“落后”,只用一个简单的循环:

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

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Python: split a list based on a condition?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

79 − = 77