You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:59:46