代码之家  ›  专栏  ›  技术社区  ›  Rob

从列表创建OrderedDict不保留订单[重复]

  •  0
  • Rob  · 技术社区  · 6 年前

    我在使用 collections.OrderedDict 上课。我正在Raspbian上使用Python2.7,Raspberry Pi的Debian发行版。我试着打印两本字典,以便进行文本冒险的比较(并排)。顺序对准确比较是至关重要的。 不管我怎么试,字典都是按通常的无序方式印刷的。

    当我在我的RPi上做这件事时,我得到的是:

    import collections
    
    ship = {"NAME": "Albatross",
             "HP":50,
             "BLASTERS":13,
             "THRUSTERS":18,
             "PRICE":250}
    
    ship = collections.OrderedDict(ship)
    
    print ship
    # OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
    

    显然有一些不正确的地方,因为它正在打印函数调用并将键和值组放入嵌套列表。。。

    这就是我在电脑上运行类似程序所得到的结果:

    import collections
    
    Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
    Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
    
    #Just for clarity:
    Joe = collections.OrderedDict(Joe)
    Bob = collections.OrderedDict(Bob)
    
    print Joe
    # OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
    print Bob
    # OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])
    

    这一次,它是有序的,但它不应该打印其他东西,虽然?(将其放入列表并显示函数调用。)

    0 回复  |  直到 9 年前
        1
  •  194
  •   Martijn Pieters    6 年前

    您正在创建词典 第一 ,然后将字典传递给 OrderedDict . 对于Python版本<3.6 (*) ,当您这样做时,顺序将不再正确。 dict 本质上是不有序的。

    改为传入一系列元组:

    ship = [("NAME", "Albatross"),
            ("HP", 50),
            ("BLASTERS", 13),
            ("THRUSTERS", 18),
            ("PRICE", 250)]
    ship = collections.OrderedDict(ship)
    

    当你打印 有序的信息技术 是不是 代表 ,这是完全正确的。 OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)]) 只是给你看,在 可复制的 代表,内容是什么 有序的信息技术 .


    (*) :在CPython 3.6实现中 迪克特 类型被更新为使用更节省内存的内部结构,该结构具有保留插入顺序的良好副作用,通过扩展,问题中显示的代码可以正常工作。从Python3.7开始 Python语言规范 已经更新,要求所有Python实现都必须遵循此行为。见 this other answer of mine 关于详细信息以及为什么您可能仍然希望使用 OrderedDict() 在某些情况下。

        2
  •  28
  •   Jan Rozycki    7 年前

    如果无法编辑定义dict的代码的这一部分,您仍然可以在任何时候以任何方式对其进行排序,如下所示:

    from collections import OrderedDict
    
    order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
    list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
    your_dict = OrderedDict(list_of_tuples)
    
        3
  •  9
  •   SomeGuy    7 年前

    大多数情况下,当我们需要定制订单而不是ASC等通用订单时,我们会选择OrderedDict。

    以下是建议的解决方案:

    import collections
    ship = {"NAME": "Albatross",
             "HP":50,
             "BLASTERS":13,
             "THRUSTERS":18,
             "PRICE":250}
    
    ship = collections.OrderedDict(ship)
    
    print ship
    
    
    new_dict = collections.OrderedDict()
    new_dict["NAME"]=ship["NAME"]
    new_dict["HP"]=ship["HP"]
    new_dict["BLASTERS"]=ship["BLASTERS"]
    new_dict["THRUSTERS"]=ship["THRUSTERS"]
    new_dict["PRICE"]=ship["PRICE"]
    
    
    print new_dict
    

    将输出:

    OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
    OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])
    

    注意 :删除条目时,新排序词典将保持其排序顺序。但是,当添加新的键时,这些键会被附加到末尾,并且排序不会被维护( official doc )

        4
  •  0
  •   Mehmet    5 年前

    使用dict.items();它可以简单如下:

    ship = collections.OrderedDict(ship.items())