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

Unk*_*der 0 python dictionary

我有一个看起来像的蟒蛇字典

people {"mykey1": myCustomObject, "mykey2": myCustomObject }
Run Code Online (Sandbox Code Playgroud)

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

class myCustomObject:
    def __init__(self, myID, firstName, lastName):
        self.ID = myID
        self.FirstName = firstName
        self.LastName = lastName
Run Code Online (Sandbox Code Playgroud)

是否可以通过自定义对象中的ID属性来订购此字典?

aba*_*ert 6

一个dict本身具有任意顺序.

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

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

如果您确实希望按顺序存储它们,则需要一些时间来维护订单.当然一个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]
Run Code Online (Sandbox Code Playgroud)

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

d2 = OrderedDict(sorted(d1.items(), key=lambda kv: kv[1].ID))
Run Code Online (Sandbox Code Playgroud)

类似示例的变体显示在OrderedDict示例和配方下的文档中.

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