2014-02-17 63 views
2

我有一个字典列表字典。类似下面:在不知道密钥的情况下访问python dict()的值

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

的列表(值)的长度为字典x的所有密钥是相同的。 我想获得任何一个值的长度,即一个列表,而不必通过显而易见的方法 - >获取键,使用len(x [keys [0]])来获得长度。

我这个代码现在:

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' 

我不开心这一点,可以更“Python化”,我相信。

+3

你能详细说明你正在努力完成什么吗? – placeybordeaux

+0

我只想要任何列表的长度即。任何键的价值。所有值都有相同的长度 – jeev

回答

4

这个什么:

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

或者:

val = x.values()[0] 

,然后你的回答是

len(val) 

一些其他的解决方案(发表thefourtheye和gnibbler)更好因为他们没有创建一个中间名单。我只是将这种回应作为一种容易记忆和明显的选择加入,而不是时间效率使用的解决方案。

+1

+1 ...但我只是做'len(x.values()[0])' –

+0

@JoranBeasley不错的选择,加上回答。 – sashkello

+0

@sashkello - 谢谢! – jeev

2

使用nextiter

>>> 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 
5

这是最有效的方式,因为我们不产生任何中间的列表。

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

注:对于这种方法的工作,词典应该有它ATLEAST一个关键。

4

工程确定在Python2或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 

这是Python2更好,因为它避免了使值的列表。在Python3作品也很好

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

在这里,x.values给你所有值的列表,那么你可以从它那里得到任何一个值的长度。

相关问题