【问题标题】:Python: Writing an empty dictionary with strings thats orderedPython:用有序的字符串编写一个空字典
【发布时间】:2014-10-02 15:15:17
【问题描述】:

请注意,我试图不寻找像 question 这样的默认有序字典。相似的东西。

如果我从集合模块中调用 OrderedDict,我可以这样做 -

 from collections import OrderedDict
 my_ordered_dict = OrderedDict()

然后我可以设置像这样调用 setitem 函数的项目,我假设魔法发生了 -

 my_ordered_dict[key1] = value1
 my_ordered_dict[key2] = value2
 my_ordered_dict[key3] = value3

得到一个完美的 OrderedDict -

>my_ordered_dict
 {key1:value1, key2:value2, key3:value3...}

但是,当我尝试像这样初始化我的键值对时:

my_ordered_dict = {key1 : value1,
                   key2 : value2,
                   key3 : value3...}

字典失去了顺序。

我可以解决这个问题,而不是初始化一个元组列表:

default = [ (key1, value1), (key2, value2), (key3, value3)]

for pair in default:
   my_ordered_dict[pair[0]] = pair[1]

但我好像错过了什么。有什么建议吗?

【问题讨论】:

    标签: python python-2.7 dictionary


    【解决方案1】:

    如果你使用:

    my_ordered_dict = {key1 : value1,
                       key2 : value2,
                       key3 : value3...}
    

    这是一个普通的(未排序的)dict,你需要这样做:

    my_ordered_dict = OrderedDict(((key1, value1), (key2, value2), (key3, value3)))
    

    【讨论】:

      【解决方案2】:

      这行得通:

      my_ordered_dict = OrderedDict(( (key1, value1), (key2, value2), (key3, value3) ))
      

      上述方法有效,因为我们使用的参数是元组,并且元组是有序的。

      再次因为一个元组是有序的,这也可以工作:

      my_ordered_dict = OrderedDict()
      my_ordered_dict.update(( (key1, value1), (key2, value2), (key3, value3) ))
      

      相比之下,这不会起作用:

      my_ordered_dict = OrderedDict({key1:value1, key2:value2,})
      

      上面OrderedDict 的参数是一个无序字典。所有订单在创建时都丢失了。

      不过,有趣的是,可以在无序字典上重新设置顺序,如 documention for the collections module 中的这些示例所示:

      >>> # dictionary sorted by key
      >>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
      OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
      
      >>> # dictionary sorted by value
      >>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
      OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
      
      >>> # dictionary sorted by length of the key string
      >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
      OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
      

      【讨论】:

        【解决方案3】:

        您需要像这样初始化 OrderedDict 以创建 OrderedDict:

        >>> dct = OrderedDict(((key1, value1), (key2, value2), (key3, value3)))
        >>> type(dct)
        <class 'collections.OrderedDict'>
        

        也就是说,像这样创建的 dict 会产生一个普通的 dict 而不是 OrderedDict:

        >>> dct = {key1: value1, key2 : value2, key3 : value3}
        >>> type(dct)
        <type 'dict'>
        

        查看 python 文档以获取一些 good OrderedDict examples

        【讨论】:

          【解决方案4】:

          无论何时写作:

          {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
          

          它将被评估为普通字典并立即失去其顺序。在您的示例中,您将使用普通字典覆盖 my_ordered_dict

          相反,您可以使用元组列表:

          OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])
          

          【讨论】:

          • @levi 它不维护键的顺序,因为您通过普通字典传递它们。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-13
          • 2016-12-11
          • 2019-06-26
          相关资源
          最近更新 更多