我有一个字典列表,其值存储为字符串。我想通过将值作为整数而不是字符串来对它们进行排序。 我有代码
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'
答案 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']))