2013-04-16 19 views
0

我正在使用字典進行首次。我想知道如何計算每個字典中「值可用」的字符串中有多少個鍵值對。我知道我可能使用len()計算字典中鍵值對的數量

seats = { 
    'A': {'A1':'available', 'A2':'unavailable', 'A3':'available'}, 
    'B': {'B1':'unavailable', 'B2':'available', 'B3':'available'}, 
    'C': {'C1':'available', 'C2':'available', 'C3':'unavailable'}, 
    'D': {'D1':'unavailable', 'D2':'available', 'D3':'available'} } 

rowChoice = raw_input('What row? >> ') 
numSeats = input('How many Seats? >> ') 

我對此很新,所以我真的需要一個非常簡單的方法,可能是一些註釋或解釋它是如何工作的。

回答

3

我會用下面的語句來計算每個嵌套字典的價值觀:

{k: sum(1 for val in v.itervalues() if val == 'available') for k, v in seats.iteritems()} 

這建立來自同一個鍵一個新的字典作爲seats與每個值的可用座位數。具有生成器技巧的sum(..)可高效計算所包含的每行字典的所有值,其值等於'available'

結果:

{'A': 2, 'C': 2, 'B': 2, 'D': 2} 

要顯示特定行你過濾可用座位,只是使用len()

row_available = [k for k, v in seats[rowChoice].iteritems() if v == 'available'] 
avail_count = len(row_available) 
if avail_count: 
    print 'there {is_are} {count} seat{plural} available in row {rowChoice}, seat{plural} {seats}'.format(
     is_are='are' if avail_count > 1 else 'is', count=avail_count, 
     plural='s' if avail_count > 1 else '', rowChoice=rowChoice, 
     seats=row_available[0] if avail_count == 1 else ' and '.join([', '.join(row_available[:-1]), row_available[-1]])) 

rowChoice = 'A'此打印:

there are 2 seats available in row A, seats A1 and A3 

但調整爲更多或更少的座位形成連貫的句子。

+0

'總和(VAL == '可用' 的VAL在v.itervalues())'也可以作爲預期布爾值相加(真爲1,假爲0 )。史詩節約5個字符 –

+0

@RobCowie:我避免了這種語法; 「bool」是「int」的一個子類的事實使得即使是有經驗的Python程序員也感覺不到,並且讓我的代碼在我的經驗中變得不那麼「可靠」。 –

+0

@RobCowie對於意圖,'1 for ...'方法當然更明確,如果處理自定義類,'__eq__'完全可以將對象從'True'和'False'之外返回...(嘗試創建你自己的班級用'__eq__'返回100 ......) –

3

使用collections.Counteritertools.chain

from collections import Counter 
from itertools import chain 

print Counter(chain.from_iterable(i.itervalues() for i in seats.itervalues())) 
# Counter({'available': 8, 'unavailable': 4}) 
+0

無法讓它爲我工作。我得到'錯誤:根:'int'對象沒有屬性'itervalues''。另外我想計算字典(子)值中的3個對象。有任何想法嗎? –