[英]Are the integer keys in a Python dictionary sorted and sorted with priority?
[英]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.