繁体   English   中英

Python字典可以保证排序的键吗?

[英]Are sorted keys guaranteed by a Python dictionary?

迭代一个字典可以产生排序的键是令人惊讶的。 如果这是保证的行为,那也将非常有用。

示例代码

fruits = {3: "banana",
          4: "grapes",
          1: "apple",
          2: "cherry"}

# Looping over the dict itelf
for each in fruits:
    print each, fruits[each]

输出

1 apple
2 cherry
3 banana
4 grapes


# Looping over the generator produces the same result too
for each in iter(fruits):
    print each, fruits[each]

注意:我想指出的是,我不想实现有序dict 我只是想验证上面编写的代码是否是python中的正常重复性行为(上述2.7版)

您可以将dict子类化,并创建自己的SortedDict类,如下所示

class SortedDict(dict):
    def __iter__(self):
        return iter(sorted(super(SortedDict, self).__iter__()))

    def items(self):
        return iter((k, self[k]) for k in self)

fruits = SortedDict({3: "banana",
          4: "grapes",
          1: "apple",
          2: "cherry"})

for each in fruits:
    print each, fruits[each]

完整的工作实施在这里

从文档:

键和值以任意顺序列出,该顺序是非随机的,在Python实现中会有所不同,并且取决于字典的插入和删除历史。

不保证对字典的迭代会产生任何特定的顺序。 特别是,不能保证它被排序,也不保证它是按插入顺序排列的,它在相等的字典之间可能是不同的,并且可能与一个解释器的执行不同。 这是一个例子:

>>> dict.fromkeys([-1, -2])
{-2: None, -1: None}
>>> dict.fromkeys([-2, -1])
{-1: None, -2: None}

两个相等的命令,两个不同的顺序。 两种dict的插入顺序都不相同,而第二个dict的按键则没有排序顺序。

如果要按排序顺序遍历键,请使用

for key in sorted(d)

如果要按插入顺序迭代键,请使用collections.OrderedDict

除了OrderedDict,您还可以使用内置的排序函数来迭代dict:

fruits = {3: "banana",
      4: "grapes",
      1: "apple",
      2: "cherry"}

for each in sorted(fruits.items(), key=lambda i:i[0]):
      print each[0], each[1]

顺便说一句,sorted()返回一个两个元素的元组列表,而不是字典。

正如文档所述,不,键不会在Python字典中排序。 但是许多人发现行为是有用的,并且在PyPI上存在许多排序命令的实现。 SortedDict数据类型完全符合您的观察:有效地按排序顺序维护其键。

一种这样的实现是sortedcontainers模块,它提供排序列表,排序dict和排序集数据类型。 它是在纯Python中实现的,但是是快速实现C的实现。 单元测试提供100%的覆盖率,并且经过了数小时的压力测试。

也许最重要的是,sortedcontainer维护了几种流行实现的性能比较以及它们的权衡描述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM