cbalawat
cbalawat

Reputation: 1131

access value of a python dict() without knowing the keys

I have a dictionary of a list of dictionaries. something like below:

x = {'a':[{'p':1, 'q':2}, {'p':4, 'q':5}], 'b':[{'p':6, 'q':1}, {'p':10, 'q':12}]}

The length of the lists (values) is the same for all keys of dict x. I want to get the length of any one value i.e. a list without having to go through the obvious method -> get the keys, use len(x[keys[0]]) to get the length.

my code for this as of now:

val = None
for key in x.keys():
    val = x[key]
    break
    #break after the first iteration as the length of the lists is the same for any key
try:
    what_i_Want = len(val)
except TypeError:
    print 'val wasn't set'

i am not happy with this, can be made more 'pythonic' i believe.

Upvotes: 2

Views: 14793

Answers (5)

sashkello
sashkello

Reputation: 17871

What about this:

val = x[x.keys()[0]]

or alternatively:

val = x.values()[0]

and then your answer is

len(val)

Some of the other solutions (posted by thefourtheye and gnibbler) are better because they are not creating an intermediate list. I added this response merely as an easy to remember and obvious option, not a solution for time-efficient usage.

Upvotes: 4

Tanveer Alam
Tanveer Alam

Reputation: 5275

>>> x = {'a':[{'p':1, 'q':2}, {'p':4, 'q':5}], 'b':[{'p':6, 'q':1}, {'p':10, 'q':12}]}
>>> len(x.values()[0])
2

Here, x.values gives you a list of all values then you can get length of any one value from it.

Upvotes: 0

falsetru
falsetru

Reputation: 369134

Using next and iter:

>>> x = {'a':[{'p':1, 'q':2}, {'p':4, 'q':5}], 'b':[{'p':6, 'q':1}, {'p':10, 'q':12}]}
>>> val = next(iter(x.values()), None) # Use `itervalues` in Python 2.x
>>> val
[{'q': 2, 'p': 1}, {'q': 5, 'p': 4}]
>>> len(val)
2

>>> x = {}
>>> val = next(iter(x.values()), None) # `None`: default value
>>> val is None
True

Upvotes: 2

John La Rooy
John La Rooy

Reputation: 304225

Works ok in Python2 or Python3

>>> x = {'a':[{'p':1, 'q':2}, {'p':4, 'q':5}], 'b':[{'p':6, 'q':1}, {'p':10, 'q':12}]}
>>> next(len(i) for i in x.values())
2

This is better for Python2 as it avoids making a list of the values. Works well in Python3 too

>>> next(len(x[k]) for k in x)
2

Upvotes: 4

thefourtheye
thefourtheye

Reputation: 239493

This is most efficient way, since we don't create any intermediate lists.

print len(x[next(iter(x))])   # 2

Note: For this method to work, the dictionary should have atleast one key in it.

Upvotes: 5

Related Questions