您的列表有点随意的顺序是由于对象是按id排序的(它是从 CPython 中对象的 RAM 地址派生的),除非它们提供了一些其他方式来定义排序。
解决问题的简单方法是简单地使用内置list.sort
方法(或函数),作为关键函数参数sorted
传递。key=len
但是,如果你想使用bisect
来维护一个排序列表,你也可以这样做,但是你的类需要定义富比较方法。
您可以将这些方法添加到您的图形类中,但将新类定义为包装器可能更容易(也更简洁)。
这是一个包装内置list
类型的简单示例。它定义了一个私有方法_cmp
来执行基于长度的比较,并且富比较“魔术”方法调用_cmp
. 为了提高效率,应该直接定义丰富的比较方法,以避免调用另一个方法,但使用_cmp
更容易阅读(和编写:))。
import bisect
class MyList(object):
def __init__(self, data):
self.data = data
def __repr__(self):
return 'MyList({0!r})'.format(self.data)
def _cmp(self, other):
return len(self.data) - len(other.data)
#Rich comparison methods
def __lt__(self, other):
return self._cmp(other) < 0
def __le__(self, other):
return self._cmp(other) <= 0
def __eq__(self, other):
return self._cmp(other) == 0
def __ne__(self, other):
return self._cmp(other) != 0
def __ge__(self, other):
return self._cmp(other) >= 0
def __gt__(self, other):
return self._cmp(other) > 0
data = (
[50, 60],
[10, 20, 30],
[1, 2, 3, 4, 5],
[5, 6],
[7, 8, 9, 10],
)
blist = []
for seq in data:
a = MyList(seq)
bisect.insort(blist, a)
print(a)
print(blist)
print()
输出
MyList([50, 60])
[MyList([50, 60])]
MyList([10, 20, 30])
[MyList([50, 60]), MyList([10, 20, 30])]
MyList([1, 2, 3, 4, 5])
[MyList([50, 60]), MyList([10, 20, 30]), MyList([1, 2, 3, 4, 5])]
MyList([5, 6])
[MyList([50, 60]), MyList([5, 6]), MyList([10, 20, 30]), MyList([1, 2, 3, 4, 5])]
MyList([7, 8, 9, 10])
[MyList([50, 60]), MyList([5, 6]), MyList([10, 20, 30]), MyList([7, 8, 9, 10]), MyList([1, 2, 3, 4, 5])]
您可能想看看heapq
:您可能会发现它比bisect
. heapq
如果定义了丰富的比较方法,将(当然)使用它们。