如何根据条件拆分列表?

新手上路,请多包涵

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

 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]

原文由 Parand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 280
2 个回答
> 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

”`

原文由 dbr 发布,翻译遵循 CC BY-SA 2.5 许可协议

good, bad = [], []
for x in mylist:
    (bad, good)[x in goodvals].append(x)

原文由 John La Rooy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏