【发布时间】:2016-01-28 21:26:58
【问题描述】:
目标是在给定整数列表的情况下找到递增/单调数组。结果组中的每个项目必须比前一个项目增加 +1
给定一个输入:
x = [7, 8, 9, 10, 6, 0, 1, 2, 3, 4, 5]
我需要找到数量不断增加的组并实现:
increasing_numbers = [(7,8,9,10), (0,1,2,3,4,5)]
最后还有越来越多的数字:
len(list(chain(*increasing_numbers)))
还有组的 len:
increasing_num_groups_length = [len(i) for i in increasing_numbers]
我尝试了以下方法来获取不断增加的数字:
>>> from itertools import tee, chain
>>> def pairwise(iterable):
... a, b = tee(iterable)
... next(b, None)
... return zip(a, b)
...
>>> x = [8, 9, 10, 11, 7, 1, 2, 3, 4, 5, 6]
>>> set(list(chain(*[(i,j) for i,j in pairwise(x) if j-1==i])))
set([1, 2, 3, 4, 5, 6, 8, 9, 10, 11])
>>> len(set(list(chain(*[(i,j) for i,j in pairwise(x) if j-1==i]))))
10
但我无法保持顺序和数量不断增加的组。
如何实现increasing_numbers 整数元组组和increasing_num_groups_length?
另外,是否有此类/类似问题的名称?
已编辑
我想出了这个解决方案,但它非常冗长,我确信有一种更简单的方法可以实现 increasing_numbers 输出:
>>> from itertools import tee, chain
>>> def pairwise(iterable):
... a, b = tee(iterable)
... next(b, None)
... return zip(a, b)
...
>>> x = [8, 9, 10, 11, 7, 1, 2, 3, 4, 5, 6]
>>> boundary = iter([0] + [i+1 for i, (j,k) in enumerate(pairwise(x)) if j+1!=k] + [len(x)])
>>> [tuple(x[i:next(boundary)]) for i in boundary]
[(8, 9, 10, 11), (1, 2, 3, 4, 5, 6)]
有没有更pythonic/更简洁的方法来做到这一点?
另一个输入/输出示例:
[输入]:
[17, 17, 19, 20, 21, 22, 0, 1, 2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14、14、14、28、29、30、31、32、33、34、35、36、40]
[出]:
[(19, 20, 21, 22), (0, 1, 2), (4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14), (28, 29, 30, 31, 32, 33, 34, 35, 36)]
【问题讨论】:
-
它会调用您的问题:查找数据单调且递增的区间。它实际上就像找到数据不增加的地方一样简单,并将其用作您的组的边界(假设数据永远不会减少,但两者似乎都是如此您的描述和您的意见)。
-
我的解决方案看起来像一些怪物 perl 脚本 =( 有没有人知道这个的 pythonic 解决方案?顺便说一句,这不是家庭作业,只是试图让算法的一部分正确。它需要这个“单调”或递增序列计数。
-
当pythonic变得晦涩难懂时,我通常会选择一个简单的for循环。
-
@alvas。您的输出似乎是错误的,因为第二个序列开始于
0, 1, 2, 2, ...。 -
@alvas。这开始变得很有趣:现在你错过了
0, 1, 2作为第二个序列。也许您应该使用其中一个答案来检查您的问题是否正确;-)
标签: python list tuples itertools iterable