如何在单次for循环中用类似list comprehension的方式生成多个分类列表
问题解答:单遍历实现多列表分类的简洁写法
完全可以实现结合两种方案的需求,仅遍历一次原列表,同时保持接近列表推导式的简洁写法,常用方案如下:
方案1:推导式+any函数实现(适合固定少量分类场景)
利用list.append()返回None(属于Falsy值)、any函数短路求值的特性,可以一行完成遍历与多列表追加:
red_objects, blue_objects, green_objects = [], [], [] # 列表推导式仅用于执行append逻辑,全None的结果列表不会产生额外业务影响 any([ red_objects.append(obj.name) if obj.color == 'red' else blue_objects.append(obj.name) if obj.color == 'blue' else green_objects.append(obj.name) if obj.color == 'green' else None for obj in objects ])
该方案仅遍历objects一次,写法简洁度和单独写三个列表推导式接近,执行效率和原生for循环一致。
方案2:defaultdict通用实现(适合分类可扩展场景)
如果后续分类可能新增,推荐用collections.defaultdict实现,代码维护成本更低,同样仅遍历一次:
from collections import defaultdict color_map = defaultdict(list) for obj in objects: color_map[obj.color].append(obj.name) # 按分类取值即可 red_objects = color_map.get('red', []) blue_objects = color_map.get('blue', []) green_objects = color_map.get('green', [])
注意:方案1的写法属于偏冷门的技巧性实现,团队协作场景下建议补充注释说明逻辑,避免其他开发者看不懂产生额外维护成本。
内容的提问来源于stack exchange,提问作者Trent
相关产品推荐
相关产品推荐

