我有一个看起来像
的python dictpeople {"mykey1": myCustomObject, "mykey2": myCustomObject }
在myCustomObject中,我有一个整数ID字段。所以看起来像
class myCustomObject:
def __init__(self, myID, firstName, lastName):
self.ID = myID
self.FirstName = firstName
self.LastName = lastName
是否可以通过自定义对象中的ID属性订购此字典???
答案 0 :(得分:6)
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树)在正确的位置插入元素。