当我更改密钥的顺序时,为什么对这个dicts列表进行排序会失败?

时间:2014-01-24 01:02:26

标签: python

我有一份我正在排序的词典列表。为什么第一种方法通过但第二种方法失败? python docs没有解决这个问题(或者我只是遗漏了一些非常明显的东西)。

listy = []
listy.append({'a':None,'b':'Fred'})
listy.append({'a':datetime.now().date(),'b':'Dave'})

listy.sort(key=lambda k:(k['b'],k['a'])) # o.k.
listy.sort(key=lambda k:(k['a'],k['b'])) # fails with "TypeError: can't compare datetime.date to NoneType"

2 个答案:

答案 0 :(得分:4)

在第一种情况下,您要比较元组

('Fred', None) < ('Dave', datetime.now().date())

由于每个元组的第一个元素不同,Python根本不需要比较第二个元素来知道哪个元素小于另一个元素。

在第二种情况下,您要将Nonedate进行比较。 Python2确实允许混合类型比较(虽然不是这种特殊情况 - 请参阅注释),但它不是特别有用,更有可能导致奇怪的错误,所以Python3中删除了这个功能

答案 1 :(得分:0)

它逐元素地比较元组。如果第一个元素相等,它只会比较第二个元素。换句话说,如果两个&#39; b&#39;价值被设定为Dave&#39;