【问题标题】:Sort Python Dictionary Objects in a List对列表中的 Python 字典对象进行排序
【发布时间】:2019-06-21 17:56:23
【问题描述】:

我正在尝试使用字典键按升序对列表进行排序。

您可以假设每个字典级别只有一个键。

输入:

res = [{'hi': {'abc': 5}}, {'bye': {'def': 5}}, {'hi': {'cba': 5}}]

我的代码:

def getitem (item):
    return (item.keys())

print (sorted(res, key = getitem))

所需输出:

[{'bye': {'def': 5}}, {'hi': {'abc': 5}}, {'hi': {'cba': 5}}]

【问题讨论】:

  • 你的字典总是一个键吗?在这种情况下,为什么要使用字典呢? dict.keys 对象的比较运算符用于 subset 关系
  • 抱歉,我已经更新了示例,字典中可能只有一个键,但可以有多个具有相同键的对象,如果对象键相同 (" hi”在上面的例子中),那么我想按它的嵌套键(“cba”之前的“abc”)对其进行排序。
  • 您应该只使用元组,为什么要使用嵌套字典?元组会按照您的要求自然排序,并且内存效率更高
  • 我正在从流数据源中一一接收这些字典对象。
  • ...那么有什么东西阻止您将它们转换为更理智/有用的数据结构吗?

标签: python python-3.x sorting dictionary


【解决方案1】:

你已经接近了——只需将 dict 传递给 iter() 以创建一个迭代器,然后在迭代器中请求 next() 项。如果存在多个,则对字典中的第一个键进行排序(Python 3.6+ 字典按插入时间排序)。比较器可以返回一个相对优先级的元组,如果外部键相等,则可以对内部键进行排序。

res = [{'hi': {'abc': 5}}, {'bye': {'def': 5}}, {'hi': {'cba': 5}}]

def compare(d):
    outer = next(iter(d))
    return outer, next(iter(d[outer]))

print(sorted(res, key=compare))

【讨论】:

  • next(iter(x)) 就足够了;无需调用keys 方法。
  • 好电话——谢谢。我猜它会忽略嵌套的字典?
  • 会的; Python 的排序方式是稳定的,因此如果两个顶级键相等,则保留输入列表中 dicts 的相对顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2011-12-22
  • 2016-06-11
  • 2015-08-24
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
相关资源
最近更新 更多