[Tutor] How to get the keys of a dict inside a dict. ValueError: too many values to unpack

Steve Willoughby steve at alchemy.com
Sun Aug 7 18:17:21 CEST 2011


On 07-Aug-11 08:37, Kayode Odeyemi wrote:
> Hello all,
>
> Please I need help figuring out this permutation.
>
> I have a dict like this:
>
> x = "{'pk': 1L, 'model': 'trans', 'fields': {'updated': 2011, 'tel':
> 3456}", "{'pk': 2L, 'model': 'trans2', 'fields': {'updated': 2011,
> 'tel': 34510}";

First of all, that's not a dict.  It's just a tuple of strings.
so, when you say:

> #loop through and get the keys of each
> for k,v in x:

You'll get one iteration, where k=the first string and v=the second.
However, you ignore k and v in all the code that follows, so I'm really 
confused what you're trying to do here.

>      keys = dict(x).keys()

Now you try to create a dict out of a tuple of strings, which won't 
quite work as written but in principle would only have created a 
dictionary with the first string as the key, and the second as value, 
not nested dictionaries.

The dict() constructor really expects to see a sequence of key/value 
pairs, so it's going to take your sequence x as a list of two such 
pairs, and then raise an exception because the strings are not key/value 
pairs.  This would succeed if you said
   keys = dict((x,)).keys()
perhaps, but it's still not at all what you're trying to accomplish.

> print keys

Note that you are re-assigning the value of keys each time through the 
loop but printing its last value after the loop exits.  Is that what you 
intended?


You're expecting Python to take a string that looks like Python source 
code and know that you want it to be interpreted as source code. 
Instead of using string values, use actual Python syntax directly, like:

  x = {
	'pk': 1L,
	'model': 'trans',
	'fields': {
		'updated': 2011,
		'tel': 3456
	}
}


-- 
Steve Willoughby / steve at alchemy.com
"A ship in harbor is safe, but that is not what ships are built for."
PGP Fingerprint 4615 3CCE 0F29 AE6C 8FF4 CA01 73FE 997A 765D 696C


More information about the Tutor mailing list