In Python, how do I iterate over a dictionary in sorted key order?

后端 未结 10 927
有刺的猬
有刺的猬 2020-11-27 10:19

There\'s an existing function that ends in the following, where d is a dictionary:

return d.iteritems()

that returns an unsort

相关标签:
10条回答
  • 2020-11-27 10:54

    You can now use OrderedDict in Python 2.7 as well:

    >>> from collections import OrderedDict
    >>> d = OrderedDict([('first', 1),
    ...                  ('second', 2),
    ...                  ('third', 3)])
    >>> d.items()
    [('first', 1), ('second', 2), ('third', 3)]
    

    Here you have the what's new page for 2.7 version and the OrderedDict API.

    0 讨论(0)
  • 2020-11-27 11:01

    Use the sorted() function:

    return sorted(dict.iteritems())
    

    If you want an actual iterator over the sorted results, since sorted() returns a list, use:

    return iter(sorted(dict.iteritems()))
    
    0 讨论(0)
  • 2020-11-27 11:02

    A dict's keys are stored in a hashtable so that is their 'natural order', i.e. psuedo-random. Any other ordering is a concept of the consumer of the dict.

    sorted() always returns a list, not a dict. If you pass it a dict.items() (which produces a list of tuples), it will return a list of tuples [(k1,v1), (k2,v2), ...] which can be used in a loop in a way very much like a dict, but it is not in anyway a dict!

    foo = {
        'a':    1,
        'b':    2,
        'c':    3,
        }
    
    print foo
    >>> {'a': 1, 'c': 3, 'b': 2}
    
    print foo.items()
    >>> [('a', 1), ('c', 3), ('b', 2)]
    
    print sorted(foo.items())
    >>> [('a', 1), ('b', 2), ('c', 3)]
    

    The following feels like a dict in a loop, but it's not, it's a list of tuples being unpacked into k,v:

    for k,v in sorted(foo.items()):
        print k, v
    

    Roughly equivalent to:

    for k in sorted(foo.keys()):
        print k, foo[k]
    
    0 讨论(0)
  • 2020-11-27 11:03

    Haven't tested this very extensively, but works in Python 2.5.2.

    >>> d = {"x":2, "h":15, "a":2222}
    >>> it = iter(sorted(d.iteritems()))
    >>> it.next()
    ('a', 2222)
    >>> it.next()
    ('h', 15)
    >>> it.next()
    ('x', 2)
    >>>
    

    If you are used to doing for key, value in d.iteritems(): ... instead of iterators, this will still work with the solution above

    >>> d = {"x":2, "h":15, "a":2222}
    >>> for key, value in sorted(d.iteritems()):
    >>>     print(key, value)
    ('a', 2222)
    ('h', 15)
    ('x', 2)
    >>>
    

    With Python 3.x, use d.items() instead of d.iteritems() to return an iterator.

    0 讨论(0)
提交回复
热议问题