我有一个包含如下元素的队列:
1 None 2 3 None 4 5 6 7 None 8 9 10 11 12 13 14 15
这里没有做分隔符的工作,仅此而已。
现在我想打印输出:
8 9 10 11 12 13 14 15
4 5 6 7
2 3
1
我可以打印此输出:
15 14 13 12 11 10 9 8
7 6 5 4
3 2
1
从右侧遍历队列。
这是代码:
length = len(sequenced_que)
for i in range(0, length):
temp = sequenced_que.pop()
if temp is None:
print()
else:
print(temp.data, end=" ")
8 9 10 11 12 13 14 15
4 5 6 7
2 3
1
通过使用临时堆栈可以实现上述期望的输出。我可以将元素推入堆栈,直到遇到None然后开始弹出它们。
但这需要额外的O(n)空间。
我只需要一个有效的算法而不是使用临时堆栈。您可以使用队列和列表的所有属性。
谢谢你:)
答案 0 :(得分:6)
您可以使用itertools.groupby
将数组“拆分”到所需的元素。
import itertools
data = [1, None, 2, 3, None, 4, 5, 6, 7, None, 8, 9, 10, 11, 12, 13, 14, 15]
# Break the array into subarrays at None
blocks = [list(v) for k, v in itertools.groupby(data, lambda e: e is None) if not k]
# Reverse the subarrays
blocks.reverse() # or as a new list: rev_blocks = blocks[::-1]
完成上述操作后,blocks
等于[[8, 9, 10, 11, 12, 13, 14, 15], [4, 5, 6, 7], [2, 3], [1]]
。如果要以相同的格式打印这些子数组:
for arr in blocks:
print(*arr, sep=' ')
答案 1 :(得分:0)
使用itertools
的解决方案:
>>> import itertools
>>> l=[1, None, 2 ,3, None, 4 ,5, 6, 7, None, 8, 9, 10, 11, 12 ,13 ,14 ,15]
>>> l2=[list(g) for k,g in itertools.groupby(l,lambda x:x is None) if not k]
>>> l2
[[1], [2, 3], [4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15]]
>>> for i in range(len(l2)):
... print l2[-(i+1)]
...
[8, 9, 10, 11, 12, 13, 14, 15]
[4, 5, 6, 7]
[2, 3]
[1]