的一種方式 - 這似乎在供電對於這個問題,但它是學習一個方便的工具 - 是使用itertools.groupby。它的工作是將一個序列的連續項組合在一起,這正是你想要在這裏做的。舉例來說,如果我們做了高達1
和2
列表:
>>> 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')]
你知道列表解析嗎?我就是這麼做的。 http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions –
「連續」是指連續的座位還是隻在同一個字母下的座位? – alcedine
連續的座位。因此,A排中有3個「可用」,彼此相鄰。例如,座位A3,A4,A5 – user2212774