【问题标题】:Python dictionary: are keys() and values() always the same order?Python字典:键()和值()总是相同的顺序吗?
【发布时间】:2010-10-24 12:29:37
【问题描述】:

看起来字典的keys()values() 方法返回的列表总是一对一的映射(假设字典在调用这两个方法之间没有改变)。

例如:

>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
    print d[k[i]] == v[i]

True
True
True

如果你不改变调用keys()和调用values()之间的字典,假设上面的for循环总是打印True是错误的吗?我找不到任何文件证实这一点。

【问题讨论】:

标签: python


【解决方案1】:

是的,您观察到的确实是一个有保证的属性——keys()values()items() 如果不更改 dict,则以一致的顺序返回列表。 iterkeys() &c 也以与对应列表相同的顺序进行迭代。

【讨论】:

  • 但是,如果列表更改,Pandas dataframe 提供了一个替代方案,可以更新或删除项目,以及项目的顺序和索引位置类似字典的结构保持不变。
【解决方案2】:

根据http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects ,dict 的keys()、values() 和items() 方法将返回其顺序对应的对应迭代器。但是,对于同一件事,我找不到对 python 2.x 官方文档的引用。

据我所知,答案是肯定的,但仅限于 python 3.0+

【讨论】:

    【解决方案3】:

    是的,它是guaranteed in python 2.x

    如果键、值和项目视图在没有干预的情况下被迭代 修改字典,项目的顺序会直接 对应。

    【讨论】:

      【解决方案4】:

      对于它的价值,我编写的一些大量使用的生产代码是基于这个假设的,我从来没有遇到过问题。我知道这不是真的:-)

      如果您不想冒险,我会尽可能使用 iteritems()。

      for key, value in myDictionary.iteritems():
          print key, value
      

      【讨论】:

        【解决方案5】:

        找到这个:

        如果items()keys()values()iteritems()iterkeys()itervalues() 没有被调用 干预修改 字典,列表将直接 对应。

        开启2.x documentation3.x documentation

        【讨论】:

        【解决方案6】:

        我对这些答案并不满意,因为我想确保导出的值即使在使用不同的字典时也具有相同的顺序。

        这里你预先指定了键的顺序,即使字典改变了,或者你使用了不同的字典,返回的值也总是有相同的顺序。

        keys = dict1.keys()
        ordered_keys1 = [dict1[cur_key] for cur_key in keys]
        ordered_keys2 = [dict2[cur_key] for cur_key in keys]
        

        【讨论】:

          【解决方案7】:

          是的。从 CPython 3.6 开始,字典 return items in the order you inserted them

          忽略说这是一个实现细节的部分。这种行为在 CPython 3.6 中得到保证,并且对于所有其他 Python 实现 starting with Python 3.7required

          【讨论】:

            【解决方案8】:

            对文档的良好参考。无论文档/实施如何,您都可以通过以下方式保证订单:

            k, v = zip(*d.iteritems())
            

            【讨论】:

            • 在python3.x中,使用dict.items()
            【解决方案9】:

            我同意其他人的观点,即在 python 3.6+ 中,如果不受用户影响,它应该保持不变。

            几天前我的代码中的一个例子:

            ips = { '001' : '142.250.178.14', '002' : '104.18.2.89', '003' : '10.251.63.21' }
            def run(self):
                for x, y in self.ips.items():
                            try:
                                subprocess.check_call(
                                ['ping', '-n', '1', y],
                                stdout=DEVNULL,  # suppress output
                                stderr=DEVNULL
                                )
                            except subprocess.CalledProcessError:
                                nextServer = ('HUB ' + x + ' is OFFLINE   ' + " IP:   " + y)
            

            并且输出的顺序总是相同的,就像我输入的一样,即只有离线服务器会按顺序显示: HUB 003 离线 IP: 10.251.63.21 因为前两个是可达的

            希望可以解决

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-08-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多