【问题标题】:Order of keys in dictionaries in old versions of Python旧版本 Python 中字典中的键顺序
【发布时间】:2011-08-03 11:53:45
【问题描述】:

代码:

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

print l

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

【问题讨论】:

  • 如果 Python 字典和大多数字典一样,它们实际上是哈希表。除其他外,这意味着键的顺序不能保证甚至指定。特别是,它不会记住添加键的顺序。
  • @cHao:这实质上意味着如果您遍历字典中的元素,您的程序将是不确定的?
  • @HelloGoodbye:我不会走那么远;那里仍然有非常可预测的行为。每次完整迭代都会看到每个键/值对中的一个。在大多数语言中,您甚至每次都以相同的顺序看到它们。但是,除非文档保证特定顺序,否则您不应该指望它是您想要的顺序。 (某些语言(如 Perl)实际上会稍微随机化顺序 - 据称是出于安全原因,但我认为这实际上只是为了让你摆脱依赖未指定行为的习惯。:) 我不认为 Python 就是这么邪恶,但是呃……)
  • 如果字典没有被修改,顺序将是相同的。从手册:“如果 items()、keys()、values()、iteritems()、iterkeys() 和 itervalues() 被调用而没有对字典进行干预修改,则列表将直接对应。这允许创建使用 zip() 的 (value, key) 对:pairs = zip(d.values(), d.keys())。"
  • @sfranky 我认为 steveayre 的意思是您使用提到的不同方法获得的内容之间的顺序是相同的,而不是与编写元素的顺序不同。

标签: python dictionary


【解决方案1】:

Python 3.7+

在 Python 3.7.0 中,dict 对象 has been declared 的插入顺序保存性质成为 Python 语言规范的官方部分。因此,您可以依赖它。

Python 3.6 (CPython)

从 Python 3.6 开始,对于 Python 的 CPython 实现,字典默认为 maintain insertion order。不过,这被认为是一个实现细节;如果您希望在其他 Python 实现中保证插入顺序,您仍应使用 collections.OrderedDict

Python >=2.7 和

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

【讨论】:

    【解决方案2】:

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

    另外,请注意OrderedDict({'a': 1, 'b':2, 'c':3}) 将不起作用,因为您使用{...} 创建的dict 已经忘记了元素的顺序。相反,您想使用OrderedDict([('a', 1), ('b', 2), ('c', 3)])

    如文档中所述,对于低于 Python 2.7 的版本,您可以使用this recipe。

    【讨论】:

    • 请记住,OrderedDict 的顺序是 insertion 顺序;如果您以这种方式插入,键只会按字母顺序出现。
    • 这是他展示的一个简化例子;它可能与他实际计划如何使用它有任何关系,也可能没有任何关系。我以前遇到过希望 OrderedDict 以排序顺序返回任意插入的人,所以我觉得我应该指出这一点。
    • 我不相信作者正在寻找保留插入顺序的字典。密钥顺序通常更为重要,它可以通过自平衡二叉搜索树来实现。在 C++ 中,我们有 std::set 。在 python 中,显然没有这样的东西(内置)。
    【解决方案3】:
    >>> print sorted(d.keys())
    ['a', 'b', 'c']
    

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

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

    【讨论】:

    • 如果你想要原始订单并且它没有被排序,这不起作用。
    【解决方案4】:

    来自http://docs.python.org/tutorial/datastructures.html

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

    【讨论】:

    • 这个短语已经不存在了。
    【解决方案5】:

    当你想使用它时,只需对列表进行排序。

    l = sorted(d.keys())
    

    【讨论】:

      【解决方案6】:

      虽然顺序无关紧要,因为字典是 hashmap。这取决于它被推入的顺序:

      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,键是 dict_keys(['a', 'b', 'c'])
      对于字符串 cbab,键是 dict_keys(['c', 'b', 'a'])

      【讨论】:

      • python 中的字典仅从 3.6+ 版本开始插入排序check this
      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2015-11-13
      • 2022-12-24
      相关资源
      最近更新 更多