在Python中对UUID v1列表进行排序
如何最快速地对UUID v1列表进行排序呢?
ss = [(uuid1(), i, time.sleep(i)) for i in range(10)]
ss
[(UUID('9a5e8b20-be62-11e3-87fa-0800270bf8cf'), 0, None), (UUID('9a5e9246-be62-11e3-87fa-0800270bf8cf'), 1, None), (UUID('9af75166-be62-11e3-87fa-0800270bf8cf'), 2, None), (UUID('9c28d4ba-be62-11e3-87fa-0800270bf8cf'), 3, None), (UUID('9df31a58-be62-11e3-87fa-0800270bf8cf'), 4, None), (UUID('a056198a-be62-11e3-87fa-0800270bf8cf'), 5, None), (UUID('a351c986-be62-11e3-87fa-0800270bf8cf'), 6, None), (UUID('a6e63dc0-be62-11e3-87fa-0800270bf8cf'), 7, None), (UUID('4f418380-cfac-11e3-87fa-0800270bf8cf'), 8, None), (UUID('7de51c1e-d075-11e3-87fa-0800270bf8cf'), 9, None)]
使用下面这个语句时,结果并不总是正确:
sorted(ss, key= lambda x: x[0])
[(UUID('4f418380-cfac-11e3-87fa-0800270bf8cf'), 8, None), (UUID('7de51c1e-d075-11e3-87fa-0800270bf8cf'), 9, None), (UUID('9a5e8b20-be62-11e3-87fa-0800270bf8cf'), 0, None), (UUID('9a5e9246-be62-11e3-87fa-0800270bf8cf'), 1, None), (UUID('9af75166-be62-11e3-87fa-0800270bf8cf'), 2, None), (UUID('9c28d4ba-be62-11e3-87fa-0800270bf8cf'), 3, None), (UUID('9df31a58-be62-11e3-87fa-0800270bf8cf'), 4, None), (UUID('a056198a-be62-11e3-87fa-0800270bf8cf'), 5, None), (UUID('a351c986-be62-11e3-87fa-0800270bf8cf'), 6, None), (UUID('a6e63dc0-be62-11e3-87fa-0800270bf8cf'), 7, None)]
我期望的排序顺序是:0,1,2,3,4,5,6,7,8,9,而不是8,9,0,1,2,3,4,5,6,7
请注意,我想排序的列表里只有UUID:在上面的例子中,按x[1]排序对我来说是行不通的。
1 个回答
2
Python中的UUID是根据它的int
属性进行排序的,这个属性是UUID对象唯一的一个成员。
def __cmp__(self, other):
if isinstance(other, UUID):
return cmp(self.int, other.int)
return NotImplemented
这和UUID v1对象中的“时间戳”部分不同(你可以通过time
属性来访问),因为它们指的是底层字节序列,顺序是不同的:
>>> x = uuid.uuid1()
>>> x
UUID('488085a8-be83-11e3-a999-1803733f0b7d')
>>> x.int
96371740624175594482388131032705469309L
>>> ((((((((((x.time_low << 16) | x.time_mid) << 16) | x.time_hi_version) << 8) | x.clock_seq_hi_variant) << 8) | x.clock_seq_low) << 48) | x.node) == x.int
True
>>> x.time
136161884817622440L
>>> (((((x.time_hi_version & 0xFFF) << 16) | x.time_mid) << 32) | x.time_low) == x.time
True
所以当你根据时间戳对UUID v1对象进行排序时,需要指定“时间”属性:
sorted(ss, key= lambda x: x[0].time)