views:

115

answers:

3

Does native built-in python dict guarantee that the keys() and values() lists are ordered in the same way?

d = {'A':1, 'B':2, 'C':3, 'D':4 } # or any other content
otherd = dict(zip(d.keys(), d.values()))

Do I always have d == otherd ?

Either it's true or false, I'm interested in any reference pointer on the subject.

PS: I understand the above property will not be true for every objects that behave like a dictionary, I just wonder for the built-in dict. When I test it looks as if it's true, and it's no surprise because having the same order for keys() and values() is probably the simplest implementation anyway. But I wonder if this behavior was explicitly defined or not.

+12  A: 

Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary's history of insertions and deletions. If items(), keys(), values(), iteritems(), iterkeys(), and itervalues() are called with no intervening modifications to the dictionary, the lists will directly correspond.

From the documentation

Dominic Rodger
+1. Didn't know that.
Manoj Govindan
so d and otherd will always be the same.
Tumbleweed
A: 

I don't know if The behavior is built-in or and guaranteed (See @Dominic Rodger's answer).

this will always give you the same result:

otherd = dict(d.iteritems())
Manoj Govindan
+2  A: 

Python 2.7 and above have ordered dictionaries, for which your statement:

d == dict(zip(d.keys(), d.values()))

would apply

Carlos Valiente