【问题标题】:Order Python Dict by Property of Object in Value? [duplicate]按值中对象的属性对 Python 字典排序? [复制]
【发布时间】:2014-01-26 05:08:50
【问题描述】:

我有一个看起来像的python dict

people {"mykey1": myCustomObject, "mykey2": myCustomObject }

在 myCustomObject 中,我有一个整数 ID 字段。所以看起来像

class myCustomObject:
    def __init__(self, myID, firstName, lastName):
        self.ID = myID
        self.FirstName = firstName
        self.LastName = lastName

是否可以通过自定义对象中的 ID 属性对该字典进行排序???

【问题讨论】:

  • dict 实例从不被订购。
  • @IgnacioVazquez-Abrams 除非可以,否则通过使用 OrderedDict,这将是 dict 的一个实例(检查它!:>>> import collections; d = collections.OrderedDict(); isinstance(d, dict)True
  • @AaronHall:OrderedDictdict 的子类实际上只是一个意外实现,所以你可能不应该依赖它;如果要检查它是否是类似字典的对象,请改用isinstance(d, MutableMapping)。但显然你是对的,你不应该假设它 notdict 子类,特别是考虑到它实际上是一个子类,并且记录在案。 :)
  • @abarnert 我知道,我只是在“聪明”。 :) 我刚刚实现了一个非 dict-inheriting MutableMapping 来回答另一个问题(我在这里碰巧问自己:stackoverflow.com/questions/21361106/…

标签: python dictionary


【解决方案1】:

dict 本质上具有任意顺序。

如果您只想访问一次以特定顺序,您可以对其进行排序。如果您不知道如何使用默认排序以外的任何其他方式对事物进行排序,请阅读Sorting HOW TO。但基本上:

for k, v in sorted(d.items(), key=lambda kv: kv[1].ID):
    print('{}: {}'.format(k, v))

如果你真的想按那个顺序存储它们,你需要一些时间来维持顺序。当然list 可以工作,但OrderedDict 的工作方式与dict 类似,只是它保持插入顺序,这对于大多数用例来说更方便。因此,如果您创建一个新的OrderedDict,然后按排序顺序将所有内容插入其中,那可能会解决您的问题:

d1 = { your original dict }
d2 = collections.OrderedDict()
for key in sorted(d1, key=lambda k: d1[k].ID):
    d2[key] = d1[key]

如果您理解理解,则可以将其简化为一行:

d2 = OrderedDict(sorted(d1.items(), key=lambda kv: kv[1].ID))

OrderedDict Examples and Recipes 下的文档中显示了类似示例的变体。

如果您希望字典维护排序顺序,您将需要某种排序的 dict 类。 stdlib 没有这样的类,但是 ActiveState 和 PyPI 上有很多可用的选项。有些是作为OrderedDict 实现的,每次更新它们时都会重新排序(或者,有时,在更新后第一次访问它们时,这允许长链更新以避免长链排序)。其他人使用bisect 或搜索树(例如,二叉红黑树或 10 元 B 树)在正确的位置插入元素。

【讨论】:

  • 很好的答案,谢谢。 lambda 表达式绝对满足了我的需求。
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2016-04-16
  • 2012-08-09
  • 2011-01-28
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
相关资源
最近更新 更多