2013-04-17 96 views
0

我無法編寫python代碼來打印一行中有多少個可用的座位。我有一套簡單的嵌套字典 - 我需要添加的是一個測試,看看有多少個連續的keys == available。輸出結果需要像「有4個座位一起可用」。python中的字典鍵

seats = {'A': ['available', 'unavailable','available','available','available'], 
     'B': ['unavailable', 'unavailable','available','available','available'], 
     'C': ['available', 'unavailable','unavailable','available','available'], 
     'D': ['available', 'unavailable','available','unavailable','unavailable']} 

是否有一個非常簡單的方法來計算一行中有多少項具有相同的值?我的確是全新的編程技術,所以我真的需要解釋代碼是如何工作的。

+0

你知道列表解析嗎?我就是這麼做的。 http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions –

+0

「連續」是指連續的座位還是隻在同一個字母下的座位? – alcedine

+0

連續的座位。因此,A排中有3個「可用」,彼此相鄰。例如,座位A3,A4,A5 – user2212774

回答

2

的一種方式 - 這似乎在供電對於這個問題,但它是學習一個方便的工具 - 是使用itertools.groupby。它的工作是將一個序列的連續項組合在一起,這正是你想要在這裏做的。舉例來說,如果我們做了高達12列表:

>>> from itertools import groupby 
>>> groupby([1,2,2,1,2,2,2,1,1,2]) 
<itertools.groupby object at 0x8ee793c> 
>>> [(key, list(group)) for key, group in groupby([1,2,2,1,2,2,2,1,1,2])] 
[(1, [1]), (2, [2, 2]), (1, [1]), (2, [2, 2, 2]), (1, [1, 1]), (2, [2])] 

我們可以在羣體價值鍵值對的列表。 (實際上他們可迭代石斑魚對象,所以我們必須採取list兌現他們看到他們。)

所以你的情況:

>>> groupby(seats["A"]) 
<itertools.groupby object at 0x8ee7e64> 
>>> [(k, list(g)) for k,g in groupby(seats["A"])] 
[('available', ['available']), ('unavailable', ['unavailable']), ('available', ['available', 'available', 'available'])] 
>>> [len(list(g)) for k,g in groupby(seats["A"]) if k == 'available'] 
[1, 3] 
>>> max(len(list(g)) for k,g in groupby(seats["A"]) if k == 'available') 
3 

隨着一點點更多的工作,我們可以得到地點也是如此,如果那些是重要的。我們可以用enumerate給座位號:

>>> list(enumerate(seats["A"])) 
[(0, 'available'), (1, 'unavailable'), (2, 'available'), (3, 'available'), (4, 'available')] 

然後組這些替代,使用key參數GROUPBY告訴它我們要組上的第二項(索引#1),可用/不可用狀態,而不是數量:

>>> grouped = groupby(enumerate(seats["A"]), key=lambda x: x[1]) 

然後提取連續可用座位:

>>> avail = [list(g) for k,g in grouped if k == 'available'] 
>>> avail 
[[(0, 'available')], [(2, 'available'), (3, 'available'), (4, 'available')]] 

從這裏我們可以做各種各樣的事情。

>>> min(avail, key=len) # one of the smallest groups 
[(0, 'available')] 
>>> max(avail, key=len) # one of the largest groups 
[(2, 'available'), (3, 'available'), (4, 'available')] 
>>> max(avail, key=len)[0][0] # start of largest 
2 
>>> next(g for g in avail if len(g) >= 2) 
[(2, 'available'), (3, 'available'), (4, 'available')] 
+0

這很好。謝謝。我希望我能儘快給你一些能力! – user2212774

1

這裏有一個快速和骯髒的代碼塊,應可幫助您開始:

if rowChoice not in seats: 
    # Tell the user they entered a bad row and keep prompting them for input until it works 

max_available = 0 
available = 0 
for chair in seats[rowChoice]: 
    # When a seat is taken, update the maxium number of available seats and reset our counter 
    if chair != "available": 
     if available > max_available: 
      max_available = available 
     available = 0 

    else: 
     available += 1 

print "There is a maximum block of %d seats available" % (max_available)