【问题标题】:Why dictionary keys order is different from the string it was created from? [duplicate]为什么字典键顺序与创建它的字符串不同? [复制]
【发布时间】:2013-12-02 16:02:07
【问题描述】:

我想创建一个字典,它将字母表中的所有字符作为键。我通过以下方式做到这一点:

import string

origAlphabetUpCase = string.ascii_uppercase
print origAlphabetUpCase

upCaseDict = dict((el,'') for el in origAlphabetUpCase)

我得到的结果如下:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
{'A': '', 'C': '', 'B': '', 'E': '', 'D': '', 'G': '', 'F': '', 'I': '', 'H': '', 'K': '', 'J': '', 'M': '', 'L': '', 'O': '', 'N': '', 'Q': '', 'P': '', 'S': '', 'R': '', 'U': '', 'T': '', 'W': '', 'V': '', 'Y': '', 'X': '', 'Z': ''}

由于某种原因,键的顺序与初始字符串中的顺序不同。似乎交换了字符对(AZ 除外)。

知道这是如何发生的以及为什么会发生吗?

【问题讨论】:

标签: python dictionary


【解决方案1】:

Python 字典没有任何顺序。

来自docs

最好将字典视为一组无序的键:值对,并要求键是唯一的(在一个字典中)。

如果您进一步阅读,

字典对象的 keys() 方法以任意顺序返回字典中使用的所有键的列表(如果要对其进行排序,只需对其应用 sorted() 函数)。

所以您可以使用sorted 函数或OrderedDict

【讨论】:

    【解决方案2】:

    最好将字典视为一组无序的键:值对,并要求键是唯一的(在一个字典中)。

    字典上的主要操作是用某个键存储一个值并提取给定键的值,实际上哪个元素在列表中的什么时间插入它可能出现在列表中间或开始或最后也是。给定的例子写在 docs.python.org 说

    >>> tel = {'jack': 4098, 'sape': 4139}
    >>> tel['guido'] = 4127
    >>> tel
    {'sape': 4139, 'guido': 4127, 'jack': 4098}
    >>> tel['jack']
    4098
    >>> del tel['sape']
    >>> tel['irv'] = 4127
    >>> tel
    {'guido': 4127, 'irv': 4127, 'jack': 4098}
    

    【讨论】:

      【解决方案3】:

      字典是键是可散列的元素。由于字典使用哈希表来有效查找键和这些键的值,因此排序未排序。

      python中的集合也是无序的,因为集合中的元素是散列的,因此查找速度很快

      if 'z' in ('x','y','z'):
        return 'z'
      

      如果是 ['x','y','z'] 列表,也会查找 O(1)O(n)

      以下来自 python 邮件列表的电子邮件大量讨论了 python 字典及其在技术细节上所做的散列。

      https://mail.python.org/pipermail/python-list/2000-March/048085.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 2022-06-15
        • 2011-01-13
        • 1970-01-01
        • 2012-04-29
        相关资源
        最近更新 更多