【问题标题】:sort a list of dictionary by taking integer value of keys stored as string通过将键的整数值存储为字符串来对字典列表进行排序
【发布时间】:2014-12-30 18:43:03
【问题描述】:

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

 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'

【问题讨论】:

  • 如果你想使用 OrderedDict 进行排序,你也不能有重复的键
  • 您的示例字典不是有效的 Python 代码,尝试将人们可以轻松复制粘贴到控制台的内容放在一起(通过复制粘贴到 your 控制台进行测试)。

标签: python sorting dictionary


【解决方案1】:

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']))

【讨论】:

  • 如果字典中不存在'pos'x.get('pos',0) 会更好。
【解决方案2】:

sorted() 的“key”关键字的参数是一个一元函数,它返回你想要排序的实际值。因此,您需要一个函数来转换列表的每个元素(我们将称为 d 的字典),访问您要排序的值,并将其从字符串转换为整数。

def dict_to_int(d):
    string_value = d['pos']
    int_value = int(string_value)
    return 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']))

【讨论】:

  • 您对dict_to_int 的定义不正确:最后一行应为return int_value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多