dict.keys() and dict.values() are always the same order, is it?

Dave Angel davea at ieee.org
Tue Apr 20 04:13:49 EDT 2010


Menghan Zheng wrote:
> Hello!
>
> Is it assured the following statement is always True?
> If it is always True, in which version, python2.x or python3.x?
>
>   
>>>> a = dict()
>>>>         
> ...
>   
>>>> assert(a.values == [a[k] for k in a.keys()])
>>>>         
> --> ?
>
>
> Menghan Zheng
>
>   
No, it's never true.  The assert statement has no return value, neither 
True nor False.

But probably you're asking whether the assert statement will succeed 
quietly.  Again, the answer is no.  The first part of the expression is 
a built-in method, and the second part is a (possibly-empty) list.  So 
it'll always throw an AssertionError.

But probably you've got a typo, and meant to include the parentheses:
    

   assert(a.values() == [a[k] for k in a.keys()])

That, I believe, is guaranteed to not fire the assertion in 2.6.

In 2.6, the docs say:

"If items(), keys(), values(), iteritems(), iterkeys(), and itervalues() are 
called with no intervening modifications to the dictionary, the lists will 
directly correspond"

In 3.x it should fire an assertion error, for any dictionary, because values() does not return a list, but an iterator for one.  However, I don't have the docs for 3.x handy, I just tried it interactively to confirm my belief.

DaveA





More information about the Python-list mailing list