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

字典没有按顺序迭代[duplicate]

  •  0
  • gwydion93  · 技术社区  · 7 年前

    我有一本按特定顺序申报的词典,我想一直按这个顺序排列。键/值不能根据它们的值按顺序排列,我只希望它按我声明的顺序排列。

    如果我有字典:

    d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
    

    0 回复  |  直到 7 年前
        1
  •  243
  •   Martijn Pieters    5 年前

    从Python3.6开始,标准 dict 默认情况下,类型保持插入顺序。

    定义

    d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
    

    将生成一个字典,其中的键按源代码中列出的顺序排列。

    这是通过为稀疏哈希表使用一个带有整数的简单数组来实现的,其中这些整数索引到另一个存储键值对(加上计算的哈希)的数组中。后一个数组恰好按插入顺序存储这些项,而整个组合实际使用的内存比Python3.5及之前版本中使用的内存要少。见 original idea post by Raymond Hettinger 了解详情。

    在3.6中,这仍然被认为是一个实现细节;参见 What's New in Python 3.6 documentation :

    Python3.7将此实现细节提升为 语言规范 迪克特 pronouncement by the BDFL . 从Python3.8开始,字典也支持 iteration in reverse .

    您可能仍然需要使用 collections.OrderedDict() class 在某些情况下,因为它在标准之上提供了一些附加功能 迪克特 reversible (这延伸到 view objects ),并支持重新排序(通过 move_to_end() method ).

        2
  •  176
  •   eumiro    14 年前
    from collections import OrderedDict
    OrderedDict((word, True) for word in words)
    

    包含

    OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])
    

    True (或任何其他不可变对象),您还可以使用:

    OrderedDict.fromkeys(words, True)
    
        3
  •  168
  •   Mohit Dabas    7 年前

    >>> from collections import OrderedDict
    >>> my_dictionary=OrderedDict()
    >>> my_dictionary['foo']=3
    >>> my_dictionary['aol']=1
    >>> my_dictionary
    OrderedDict([('foo', 3), ('aol', 1)])
    >>> dict(my_dictionary)
    {'foo': 3, 'aol': 1}
    
        4
  •  39
  •   mgilson    8 年前

    注意,这个答案适用于python3.7之前的python版本。cpython3.6在大多数情况下维护插入顺序作为实现细节。从Python3.7开始,已经声明实现必须保持插入顺序才能兼容。


    python字典是无序的。如果你想要一本有序的词典,试试看 collections.OrderedDict

    请注意,OrderedDict是在Python2.7的标准库中引入的。如果您有一个旧版本的python,您可以在 ActiveState

        5
  •  13
  •   Fire Lancer    16 年前

    字典将使用一个使搜索更有效的顺序,而你不能改变它,

    您可以只使用一个对象列表(简单情况下是一个2元素元组,甚至是一个类),并在末尾附加项。然后可以使用线性搜索在其中查找项目。

    或者,您可以创建或使用不同的数据结构,以维护秩序。

        6
  •  7
  •   smushface    12 年前

    我在试图弄清楚如何让信息技术正常工作的时候看到了这篇文章。用于Eclipse的PyDev根本找不到OrderedDict,所以我决定按照我希望的顺序对字典的键值进行一个元组。当我需要输出我的列表时,我只需遍历元组的值,并将迭代后的“key”从元组插入字典中,以按需要的顺序检索值。

    例子:

    test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....")
    test_tuple = ( 'val1', 'val2', 'val3', 'val4')
    for key in test_tuple: print(test_dict[key])
    

    注意:其他人建议的列表列表方法对我来说并不真正有意义,因为列表是有序的和索引的(而且与字典也是不同的结构)。

        7
  •  6
  •   nealous3    9 年前

    你真的不能用字典做你想做的事。你已经有字典了 d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10} 创建。我发现一旦它被创造出来,就没有办法维持秩序了。我所做的是用对象生成一个json文件:

    {"ac":33,"gw":20,"ap":102,"za":321,"bs":10}
    

    r = json.load(open('file.json'), object_pairs_hook=OrderedDict)
    

    然后使用:

    print json.dumps(r)
    

    去验证。

        8
  •  4
  •   sanyassh Khushboo Tahir    7 年前
    from collections import OrderedDict
    list1 = ['k1', 'k2']
    list2 = ['v1', 'v2']
    new_ordered_dict = OrderedDict(zip(list1, list2))
    print new_ordered_dict
    # OrderedDict([('k1', 'v1'), ('k2', 'v2')])
    
        9
  •  2
  •   Ville    7 年前

    另一个选择是使用熊猫 dataframe 因为它保证了类dict结构中项目的顺序和索引位置。

        10
  •  1
  •   Rasmus Kaj    16 年前

    __contains__ , __getitem__ , __delitem__ , __setitem__ 还有一些。该类可以有任何您喜欢的行为,例如在键上私有一个排序迭代器。。。

        11
  •  1
  •   eyquem    13 年前

    如果希望字典按特定顺序排列,还可以创建列表列表,其中第一项是键,第二项是值 看起来像这样

    >>> list =[[1,2],[2,3]]
    >>> for i in list:
    ...     print i[0]
    ...     print i[1]
    
    1
    2
    2
    3
    
        12
  •  1
  •   Evan Byrne Airith    7 年前

    我在开发Django项目时也遇到了类似的问题。我不能使用OrderedDict,因为我运行的是python的旧版本,所以解决方案是使用Django的SortedDict类:

    https://code.djangoproject.com/wiki/SortedDict

    例如。,

    from django.utils.datastructures import SortedDict
    d2 = SortedDict()
    d2['b'] = 1
    d2['a'] = 2
    d2['c'] = 3
    

    collections.OrderedDict ,在这个线程中,其他人已经提供了许多例子。

        13
  •  0
  •   Martijn Pieters    7 年前

    你可以做我为字典做的同样的事。

    创建列表和空字典:

    dictionary_items = {}
    fields = [['Name', 'Himanshu Kanojiya'], ['email id', 'hima@gmail.com']]
    l = fields[0][0]
    m = fields[0][1]
    n = fields[1][0]
    q = fields[1][1]
    dictionary_items[l] = m
    dictionary_items[n] = q
    print dictionary_items