我想根据最后两列对元组列表进行排序:
mylist = [(33, 36, 84), (34, 37, 656), (23, 38, 42)]
我知道我可以这样做:
final = sorted(mylist, key:lambda x: [ x[1], x[2]])
现在我的问题是我想要将列表的第二列与特殊条件进行比较:如果两个数字之间的差异小于偏移量,则应将它们视为相等(36 == 37 == 38)和第三列应该用于对列表进行排序.我希望看到的最终结果是:
mylist = [(23, 38, 42) (33, 36, 84), (34, 37, 656)]
我在考虑创建自己的整数类型并覆盖等于运算符.这可能吗?这有点难过吗?有没有更好的方法来解决这个问题?
我认为最简单的方法是创建一个比较你想要的新类:
mylist = [(33, 36, 84), (34, 37, 656), (23, 38, 42)] offset = 2 class Comp(object): def __init__(self, tup): self.tup = tup def __lt__(self, other): # sorted works even if only __lt__ is implemented. # If the difference is less or equal the offset of the second item compare the third if abs(self.tup[1] - other.tup[1]) <= offset: return self.tup[2] < other.tup[2] # otherwise compare them as usual else: return (self.tup[1], self.tup[2]) < (other.tup[1], other.tup[2])
示例运行显示您的预期结果:
>>> sorted(mylist, key=Comp) [(23, 38, 42), (33, 36, 84), (34, 37, 656)]
我认为它比使用functools.cmp_to_key
更清洁,但这是个人偏好的问题.