字典中键的顺序


101

码:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

打印['a', 'c', 'b']。我不确定该方法如何keys()确定l中关键字的顺序。但是,我希望能够以“适当”的顺序检索关键字。当然,正确的顺序将创建列表['a', 'b', 'c']


3
如果Python字典与大多数字典一样,它们实际上是哈希表。除其他外,这意味着不能保证甚至不能指定键的顺序。特别是,它不记得添加键的顺序。
cHao 2011年

3
@cHao:从本质上讲,这意味着如果您遍历字典中的元素,您的程序将是不确定的?
HelloGoodbye 2014年

4
@HelloGoodbye:我不会走那么远。那里仍然有非常可预测的行为。每次完整迭代都会看到每个键/值对中的一个。在大多数语言中,您甚至每次都可以以相同的顺序看到它们。但是,除非文档保证特定的顺序,否则您不应指望它是您想要的顺序。(有些语言(例如Perl)实际上会稍微随机化顺序-据说出于安全原因,但是我认为这实际上只是使您摆脱了依赖未指定行为的习惯。:)我不认为 Python完全可以那邪恶,但是……)
cHao 2014年

1
如果未修改字典,则顺序将相同。在手册中:“如果在不对字典进行任何中间修改的情况下调用items(),keys(),values(),iteritems(),iterkeys()和itervalues(),这些列表将直接对应。这允许创建使用zip()的(值,键)对的对:pair = zip(d.values(),d.keys())。”
steveayre 2015年

2
@sfranky我认为steveayre的意思是,使用上述不同方法获得的结果之间的顺序是相同的,与编写元素的顺序相同。
bli

Answers:


78

您可以使用OrderedDict(需要Python 2.7)或更高版本。

另外,请注意,OrderedDict({'a': 1, 'b':2, 'c':3})由于dict您使用进行创建的操作{...}已经忘记了元素的顺序,因此该操作无效。相反,您想使用OrderedDict([('a', 1), ('b', 2), ('c', 3)])

如文档中所述,对于低于python 2.7的版本,可以使用配方。


18
请记住,OrderedDict的顺序是插入顺序。如果您以这种方式插入按键,则它们只会按字母顺序显示。
休·博斯韦尔

这是他作为简化示例显示的内容;它可能与他实际上打算如何使用它无关。我以前遇到过一些人,他们期望OrderedDict以排序的顺序返回任意插入,因此我觉得应该指出这一点。
休·博斯韦尔

119

Python 3.7以上

在Python 3.7.0中dict对象的插入顺序保留性质已声明为Python语言规范的正式组成部分。因此,您可以依靠它。

Python 3.6(CPython)

从Python 3.6开始,对于Python的CPython实现,字典默认情况下保持插入顺序。但是,这被认为是实现细节。collections.OrderedDict如果希望在其他Python实现中保证插入顺序,则仍应使用。

Python> = 2.7和<3.6

collections.OrderedDict当您需要dict记住插入项目顺序的时,请使用该类。


48
>>> print sorted(d.keys())
['a', 'b', 'c']

使用sorted函数,它对传入的可迭代对象进行排序。

.keys()方法以任意顺序返回键。


12
如果您想要原始订单并且未排序,则此方法不起作用。
西蒙(Simon)

12

只需在要使用列表时对其进行排序。

l = sorted(d.keys())


1

尽管顺序无关紧要,因为字典是哈希图。这取决于将其推入的顺序:

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

输出:
对于字符串abbc,键为字符串cbab的dict_keys(['a','b','c'])
对于密钥cbab,键为dict_keys(['c','b','a'])


1
python中的字典仅从3.6+版本开始才插入命令进行检查
Crivella
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.