0

我正在尝试订购一个python dict,并且我正在尝试找到最pythonic的方式来做到这一点。这是字典的样子:

{
 u'key1': {'a': 'name', 'number': 282},
 u'key2': {'a': 'name2','number': 1421},
 u'key3': {'a': 'name3', 'number': 95}, 
}

我怎样才能命令这个字典:

{
 u'key2': {'a': 'name2','number': 1421},
 u'key1': {'a': 'name', 'number': 282},
 u'key3': {'a': 'name3', 'number': 95}, 
}

按实习生字典中的数字键排序?感谢您的帮助!

4

2 回答 2

3

如果你想要一个保持排序顺序的字典,你需要一个不同的数据结构。如果您搜索 PyPI,您会发现各种选项。

其中一些构建在为此类事物设计的数据结构之上(红黑树、B 树、跳过列表),因此它们可以很快完成所有操作。其他人的工作方式是每次修改它们时重新排序(或者做一个更聪明的变体——在一次或多次修改后每次访问它们时重新排序)。

我不想特别推荐一个并阻止您阅读其中的一些,所以我将展示如何使用搜索中返回的第一个,sorteddict我从未使用过:

sd = sorteddict.sorteddict({
        u'key1': {'a': 'name', 'number': 282},
        u'key2': {'a': 'name2','number': 1421},
        u'key3': {'a': 'name3', 'number': 95}, 
    }, key=operator.itemgetter('number'))

但是,如果您只是一次构建 dict 并且从不修改它,那么使用 an 会更容易(并且可能更快)OrderedDict,如inspectorG4dget 的回答中所述。只需先将键和值按排序顺序排列即可。甚至sorted可以为你做这件事:

od = collections.OrderedDict(sorted(d.items(), key=lambda item: item[1]['number']))

如果您想手动执行此操作,您可以使用“索引列表”来执行此操作:您按顺序构建或维护的键列表(或OrderedDictsortedlistsorteddict),并用于查找要查找的键。但是实际上没有充分的理由这样做,除非您需要有多种方法来索引相同的映射(或了解如何OrderedDict在幕后工作 - 但为此,首先阅读从文档链接的 Py2.4配方的有序字典)。

于 2013-07-16T19:44:29.717 回答
1

字典是无序的。它们保存的值由与这些值关联的键访问。
因此,如果您想要字典{'a': 'name', 'number': 282},您可以通过调用来访问它myDict[u'key1']

dict在 a 中排序键是必需/有用的功能的情况很少见。

但是,无论出于何种原因,如果您仍然想以某种方式订购 dict,您可以考虑使用 a collections.OrderedDict,这将保留您插入键、值对的顺序

如果您想要dict按与其'number'键关联的值排序的那些内部 s 的列表,那么这将执行此操作:

myList = sorted(myDict.values(), key=lambda d:d['number'])

希望这可以帮助

于 2013-07-16T19:19:33.193 回答