按字典键的整数对字典进行排序

时间:2014-05-21 21:02:24

标签: python sorting dictionary

假设我有一本字典:

thedict={'1':'the','2':2,'3':'five','10':'orange'}

我想按键对这本词典进行排序。如果我执行以下操作:

for key,value in sorted(thedict.iteritems()):
     print key,value

我将获得

1 the
10 orange
2 2
3 five

因为键是字符串而不是整数。我想对它们进行排序,好像它们是整数一样,所以条目“10,橙色”是最后一个。我觉得这样的事情会奏效:

for key,value in sorted(thedict.iteritems(),key=int(operator.itemgetter(0))):
    print key,value

但是这产生了这个错误:

TypeError: int() argument must be a string or a number, not 'operator.itemgetter'

我在这里做错了什么?谢谢!

2 个答案:

答案 0 :(得分:4)

我认为你可以用lambda表达式轻松地做到这一点:

sorted(thedict.iteritems(), key=lambda x: int(x[0]))
# with Python3, use thedict.items() for an iterator

问题在于您将可调用对象传递给int()内置函数,并尝试将int()调用的返回值用作密钥的可调用对象。您需要为key参数创建一个callable。

您获得的错误基本上告诉您不能使用operator.itemgetter(可调用)调用int(),您只能使用字符串或数字来调用它。

答案 1 :(得分:2)

这是人们对itemgetter无法解释的吸引力导致他们误入歧途的时代之一。只需使用lambda

即可
>>> thedict={'1':'the','2':2,'3':'five','10':'orange'}
>>> sorted(thedict.iteritems(), key=lambda x: int(x[0]))
[('1', 'the'), ('2', 2), ('3', 'five'), ('10', 'orange')]

问题是,int(operator.itemgetter(0))正在被立即评估,以便将其作为参数传递给sorted。因此,您正在构建itemgetter,然后尝试在其上调用int(这不起作用,因为它不是字符串或数字)。