如何用Python的sort方法实现对象列表半排序(指定id移至末尾)
使用sort方法实现指定id对象移至列表末尾
首先,你定义的packet类和对象列表如下:
class packet(): def __init__(self, id, data): self.id, self.data = id, data my_list = [packet(1,"blah"),packet(2,"blah"),packet(1,"blah"),packet(3,"blah"),packet(4,"blah")]
你已经通过列表推导式实现了需求(注:原代码存在两处笔误,已修正):
def semisort(data, target_id): return [o for o in data if o.id != target_id] + [o for o in data if o.id == target_id] semisort(my_list, 1)
基于sort方法的Python风格实现
可以利用list.sort()方法的key参数,通过给目标元素设置排序权重来实现需求:
def semisort_with_sort(data, target_id): # 创建列表副本,避免修改原列表;若允许直接修改原列表,可直接调用data.sort() sorted_list = data.copy() sorted_list.sort(key=lambda x: x.id == target_id) return sorted_list # 调用示例 result = semisort_with_sort(my_list, 1)
实现原理
- 匿名函数
lambda x: x.id == target_id会返回布尔值:元素id等于目标id时返回True,否则返回False - Python中布尔值的排序规则为
False < True,因此所有非目标id的元素会排在前面,目标id的元素会自动移至末尾 list.sort()是稳定排序,原列表中非目标id元素之间、目标id元素之间的相对顺序会被保留
如果允许直接修改原列表,写法可以更简洁:
my_list.sort(key=lambda x: x.id == 1)
内容的提问来源于stack exchange,提问作者Jakob Lovern
相关产品推荐
相关产品推荐

