【问题标题】:Why dictionary values aren't in the inserted order?为什么字典值不在插入顺序中?
【发布时间】:2011-08-29 00:24:06
【问题描述】:

当我声明一个列表 1,2,3,4 并对其进行处理时,即使只是打印,我也会返回相同的序列 1,2,3,4。

但是当我用字典做任何事情时,它们总是改变数字顺序,就像它以我无法理解的扭曲方式排序一样。

test1 = [4,1,2,3,6,5]
print test1
test2 = {"c":3,"a":1,"b":2,"d":4}
print test2 

[4, 1, 2, 3, 6, 5]
{'a': 1, 'c': 3, 'b': 2, 'd': 4}

'a' 是如何成为第一个元素和 'c' 的,即使它按字母顺序对字典进行排序,它应该是 1,2,3,4 或 a,b,c,d 而不是 1,3 ,2,4 。 wT?F @!$!@$#@!

那么我如何打印,从字典中获取值而不改变元素的位置?

【问题讨论】:

  • 为什么要关心字典键的保存顺序? “最好将字典视为 unordered 一组 key: value 对,并要求键是唯一的(在一个字典中)。”
  • 我很在意,因为我需要精确的顺序才能在我的网络上显示一些内容,这是一种非常方便的方式,for keys, values in dict.items()。现在它即将变得不是很好的解决方案,因为字典已经不适用了。
  • AFAIK,没有任何具有关联数组的语言默认维护插入顺序。这不是一个好主意,因为有几种行为是任意的(覆盖时会发生什么,删除和重新插入时会发生什么)。
  • 我来自未来。它们现在是(在 Python 3.7+ 和 CPython 3.6+ 上)。

标签: python dictionary sequence


【解决方案1】:

Python 中的字典根据定义是无序的。如果您需要插入值的顺序,请使用 OrderedDict(它在 Python 2.7 和 3.x 中可用)。

【讨论】:

  • 我不需要排序字典。当我打印字典时,我需要得到相同的序列,而不是一些奇怪的序列(排序或我不知道)。
  • 也许您需要考虑字典以外的其他集合类型?
  • Viktor,您必须自己维护排序或将其插入到排序字典中(这将保持插入顺序)。您不能让“正常”字典维护排序顺序。是的,如果您依赖顺序,即使您无法定义排序算法,它也会被“排序”。
  • 对于这个功能,你应该保留一个列表来维护你的键的顺序。如果您希望您的 dict 条目按照它们插入的顺序排序,请将密钥附加到您的密钥列表中。然后,当您需要从字典中按顺序获取值时,请执行类似 [ my_dict[key] for key in ordered_key_list ]
  • @Viktor -- 他们说完全学习一项技能需要 5000 到 10,000 个小时。 Python 是更好(更容易学习)的语言之一,但成为一名程序员至少需要五年时间。或多或少 40 分钟不会有任何影响。
【解决方案2】:

显然您知道列表。您可以在列表的第 i 个索引处请求元素。这是因为列表是有序的。

>>> [1,2,3,4] == [1,4,3,2]
False

在这种情况下,您可以想到字典,但索引是键。因此,如果两个字典中所有键的对应值相同,则两个字典相等(如果一个字典有另一个没有的键,则两者不相等)。因此:

>>> {1:'a', 2:'b'} == {2:'b', 1:'a'}
True

更多琐事

字典对字典的键执行称为hashing 的操作,这样当您请求特定键(索引)处的值时,它可以更快地检索到该值。

希望对你有帮助

【讨论】:

  • 这不是琐事。了解散列对于软件开发中的许多任务都至关重要。它有助于理解为什么字典不是自然排序的,尽管“它们不是,好吗?”也是一个很好的解释。
  • 我同意这不是琐事,但 OP 似乎对这个主题很陌生,所以我将其标记为琐事,因为它可能不在他现在想学习的优先级列表中
【解决方案3】:

如果您想按顺序查看条目。类似:

test2 = {"c":3,"a":1,"b":2,"d":4}
ks = test2.keys()
ks.sort()
for key in ks:
   print key + ':' + str(test2[key])

(剪切、粘贴、调味)

【讨论】:

  • 为什么不for key, value in sorted(d.items())
【解决方案4】:

在你变得如此愤怒和沮丧之前,也许你应该先了解一下字典到底是什么以及它是如何工作的:

http://docs.python.org/library/stdtypes.html#mapping-types-dict

Python dicts 使用哈希表作为底层存储机制。这意味着从您提供的密钥生成哈希密钥。无法保证使用这些哈希键进行排序。当您请求 values()、keys() 或 items() 时,字典中的条目会按照它们在底层哈希表中的位置顺序进行提取。

使用哈希表的优点是速度非常快。与使用红黑树存储机制( 按原始键排序)的 c++ 中的 map 类不同,哈希表不需要经常重组以保持高效。有关哈希表的更多信息,请参阅:

http://en.wikipedia.org/wiki/Hash_table

正如其他发帖者所说,如果您需要一个按键排序的字典,请查找 OrderedDict。

祝你好运!

【讨论】:

  • 对于在现代重新访问此线程的人们,请注意,从 python 3.6 开始,字典保留插入元素的顺序。
【解决方案5】:

字典未排序。这是有据可查的。不要依赖字典的顺序。

【讨论】:

    【解决方案6】:

    字典排序顺序未定义!不要依赖它做任何事情。如果您确实需要排序字典,请查找排序字典,但通常不需要。

    例子:

    • python 2.7,它内置在集合模块中
    • Django 附带了一个 SortedDict
    • 2.4-2.7可以使用ordereddict模块,可以pip install或者easy_install就可以了

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 1970-01-01
      • 2018-11-20
      • 2022-06-11
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2012-08-09
      相关资源
      最近更新 更多