如何用Pythonic一行代码按suit属性拆分对象数组?
按
suit属性分组对象数组的Pythonic写法 嘿,我太懂你想要那种简洁又地道的Python一行代码了!先帮你排查下用itertools.groupby没得到预期结果的大概率原因——它要求输入序列必须先按分组键排序!如果你的对象数组没提前按suit排好序,groupby会把相同suit但不连续的元素拆成不同组,自然不符合你的需求。
下面给你几种符合要求的一行代码方案,按需选择:
方案1:直观的字典推导式(适合小型数据集)
这种写法简单易懂,一眼就能看明白逻辑:
result = {suit: [obj for obj in your_list if obj.suit == suit] for suit in {obj.suit for obj in your_list}}
它先提取所有唯一的suit值,再为每个suit筛选出对应的对象。缺点是会遍历原数组多次,数据量大时效率稍低。
方案2:单次遍历的reduce写法(高效Pythonic)
用functools.reduce实现一次遍历完成分组,效率更高:
from functools import reduce result = reduce(lambda d, obj: d.setdefault(obj.suit, []).append(obj) or d, your_list, {})
这里setdefault会自动为不存在的suit创建空列表,append返回None,所以用or d确保每次reduce都返回更新后的字典,全程只遍历一次原数组。
方案3:修正后的itertools.groupby写法
如果你还是想用groupby,只要先对数组按suit排序就行,也是一行:
from itertools import groupby result = {k: list(v) for k, v in groupby(sorted(your_list, key=lambda x: x.suit), key=lambda x: x.suit)}
注意排序会改变原数组的元素顺序(如果在意顺序的话),但分组结果是完全正确的。
内容的提问来源于stack exchange,提问作者user3483203
相关产品推荐
相关产品推荐

