通过Value中的Object属性来命令Python Dict?

时间:2014-01-26 05:08:50

标签: python dictionary

我有一个看起来像

的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属性订购此字典???

1 个答案:

答案 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树)在正确的位置插入元素。