【问题标题】:Printing small groups of data in queue in reverse order以相反的顺序打印队列中的小数据组
【发布时间】:2017-08-30 14:16:22
【问题描述】:

我有一个包含以下元素的队列:

1 None 2 3 None 4 5 6 7 None 8 9 10 11 12 13 14 15

这里 None 做分隔符的工作,仅此而已。

现在我想像这样打印输出:

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) 额外空间。

我只需要一个高效的算法而不是使用临时堆栈。您可以使用队列和列表的所有属性。

谢谢你:)

【问题讨论】:

  • 您目前的方法有什么问题?是不是因为你打电话太频繁了print()?临时堆栈有什么令人反感的?您说它“需要 O(n) 额外空间”,但只有当您的队列不包含 None 分隔符时才会这样。如果您可以指望数据总是被None 分隔符分块,它可能会使用比 O(n) 少得多的额外空间。您确定内存消耗是一个限制因素吗?
  • 蟒蛇queue 没有方法.pop()。您使用的是哪种队列?
  • 我使用的是双端队列,因为它允许在两端添加和删除
  • @StevenRumbalski 在我的情况下内存消耗不是限制因素。毕竟我正在练习算法。我正在尝试打印树的反向级别顺序。我书中给出的解决方案是使用队列和单个堆栈。我尝试了自己的方法,但我需要这个临时堆栈。所以我只是想如果没有那个临时堆栈是否可以解决这个问题。
  • 下次问得更清楚。您对堆栈方法的内存消耗提出了异议,并标记了您的问题数据结构和算法。您将数据结构称为queue,但未指定您使用的是deque

标签: python algorithm data-structures stack queue


【解决方案1】:

您可以使用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=' ')

【讨论】:

  • 我是 python 新手,你能解释一下 itertools 是做什么的吗
  • 但这与队列或列表无关。
  • @cᴏʟᴅsᴘᴇᴇᴅ 没关系。我们可以像列表一样遍历队列。在问题中,我提到我们也可以使用列表的所有属性
  • @bharath 可以点击 itertools.groupby 超链接查看函数的作用
  • @bharath:一个简短的总结(来自文档):“该模块标准化了一组核心的快速、内存高效的工具,这些工具本身或组合都很有用。它们一起形成了一个“迭代器代数” ” 使得在纯 Python 中简洁高效地构建专用工具成为可能。”
【解决方案2】:

使用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]

【讨论】:

  • (可选)您可以将-(i+1) 替换为~i
  • x in [None] 似乎不寻常 - x is None 会更常见。
猜你喜欢
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2017-05-29
  • 2021-08-23
  • 2016-02-18
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多