通过将存储为字符串的键的整数值对字典列表进行排序

时间:2014-11-04 00:11:49

标签: python sorting dictionary

我有一个字典列表,其值存储为字符串。我想通过将值作为整数而不是字符串来对它们进行排序。  我有代码

 XWordDict=[{"name":"ABC","pos":"1"},{"name":"GHI","pos":"10"},{"name":"DEF","pos":"2"}]
Xlistsorted=sorted(XWordDict,key=(operator.itemgetter("pos")))

这将订单作为

[{'name': 'ABC', 'pos': '1'}, {'name': 'GHI', 'pos': '10'}, {'name': 'DEF', 'pos': '2'}]

然而我希望它是

 [{'name': 'ABC', 'pos': '1'}, {'name': 'DEF', 'pos': '2'}, {'name': 'GHI', 'pos': '10'}]

如果我改为

Xlistsorted=sorted(XWordDict,key=int(operator.itemgetter("pos)))

它出错了

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

2 个答案:

答案 0 :(得分:8)

key参数需要是一个函数。 operator.itemgetter(i)返回一个函数,但为了在其上添加额外的处理,你必须使用lambda。因为itemgetter返回一个函数,你可以调用结果在字典上使用它(你在lambda中作为x传递:

listsorted = sorted(XWordDict, key=lambda x: int(operator.itemgetter("pos")(x)))
listsorted
Out[16]: 
[{'name': 'ABC', 'pos': '1'},
 {'name': 'DEF', 'pos': '2'},
 {'name': 'GHI', 'pos': '10'}]

那就是说itemgetter可能是一个过于复杂的解决方案,你可以这样做:

listsorted = sorted(XWordDict, key=lambda x: int(x['pos']))

答案 1 :(得分:2)

sort()' s" key" keyword是一个一元函数,它返回您想要排序的实际值。因此,您需要一个转换列表中每个元素的函数(我们将调用的字典d),访问您要排序的值,并将其从字符串转换为整数。

def dict_to_int(d):
    string_value = d['pos']
    int_value = int(string_value)
    int_value

您可以将此传递给sorted(),如下所示:

sorted_list = sorted(list_of_dicts, key=dict_to_int)

这个函数是一个冗长的例子,可以大大缩短并转换成一个相当简洁的lambda:

lambda d: int(d['pos'])

并因此使用:

sorted_list = sorted(list_of_dicts, key=lambda d: int(d['pos']))