2014-02-17 58 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給你所有值的列表,那麼你可以從它那裏得到任何一個值的長度。

相關問題