Protobuf重复字段子属性引用及多字段排序问题求助
解决Protobuf重复字段排序的问题
你遇到的AttributeError其实很好理解:bigExample.middle_id.small_id是RepeatedCompositeFieldContainer类型,它是整个small实例的集合,不是单个对象,所以你直接访问它的.high_id肯定会报错——这个集合本身没有这个属性,只有集合里的每一个small实例才有。
1. 正确引用重复字段的子元素排序
你要排序的是small_id集合里的每一个small对象,而不是bigExample本身。这里有两种简洁的处理方式:
方式一:原地排序(推荐)
Protobuf的RepeatedCompositeFieldContainer自带了sort方法,你可以直接在原集合上做原地排序,只需要给key参数传一个lambda函数,用来从每个small实例里提取排序依据:
# 先按high_id升序,再按low_id升序排序 bigExample.middle_id.small_id.sort(key=lambda item: (item.high_id, item.low_id))
方式二:生成新列表后替换
如果不想修改原集合的内存地址,也可以用sorted函数生成一个排序后的新列表,再赋值回原容器:
# 生成排序后的新列表 sorted_items = sorted(bigExample.middle_id.small_id, key=lambda item: (item.high_id, item.low_id)) # 替换原容器的内容 bigExample.middle_id.small_id[:] = sorted_items
2. 按多个字段排序的便捷方式
其实上面的方法就是最简便的多字段排序方案了——不需要自己实现复杂的排序逻辑,只需要让lambda返回一个包含多个排序字段的元组即可。元组会按顺序依次比较每个元素,正好满足你的“先按high_id,再按low_id”的需求。
如果需要某些字段降序排序(比如high_id降序,low_id升序),对于数值类型的字段,直接在字段前加负号就行:
bigExample.middle_id.small_id.sort(key=lambda item: (-item.high_id, item.low_id))
内容的提问来源于stack exchange,提问作者chaoyq
相关产品推荐
相关产品推荐

