32

LinkedHashMap is the Java implementation of a Hashtable like data structure (dict in Python) with predictable iteration order. That means that during a traversal over all keys, they are ordered by insertion. This is done by an additional linked list maintaining the insertion order.

Is there an equivalent to that in Python?

Johnno Nolan
  • 29,228
  • 19
  • 111
  • 160
dmeister
  • 34,704
  • 19
  • 73
  • 95

5 Answers5

23

As of Python 3.7, dict objects maintain their insertion order by default.

If you're on Python 2.7 or Python >=3.1 you can use collections.OrderedDict in the standard library.

This answer to the question How do you retrieve items from a dictionary in the order that they’re inserted? contains an implementation of an ordered dict, in case you're not using Python 3.x and don't want to give yourself a dependency on the third-party ordereddict module.

Eli Courtwright
  • 186,300
  • 67
  • 213
  • 256
12

Although you can do the same thing by maintaining a list to keep track of insertion order, Python 2.7 and Python >=3.1 have an OrderedDict class in the collections module.

Before 2.7, you can subclass dict following this recipe.

Jacob Marble
  • 28,555
  • 22
  • 67
  • 78
sykora
  • 96,888
  • 11
  • 64
  • 71
  • The OrderedDict is coming in Python 3.1, but is not yet in 3.0, according to the documentation you linked. – kquinn Mar 17 '09 at 12:33
3

I am not sure whether this is what you are asking for:

>>> dic = {1: 'one', 2: 'two'}
>>> for k, v in dic.iteritems():
...     print k, v

you can order the dic in the order of the insertion using ordereddict module.

d = ordereddict(dic, relax=True)
aatifh
  • 2,317
  • 4
  • 27
  • 30
2

In addition to the validated comment;

As of Python 3.7, dict preserves insertion order.

This answer shows this with details.

Isa Rota
  • 433
  • 4
  • 8
1

I don't think so; you'd have to use a dict plus a list. But you could pretty easily wrap that in a class, and define keys, __getitem__, __setitem__, etc. to make it work the way you want.

DNS
  • 37,249
  • 18
  • 95
  • 132