【发布时间】:2013-09-09 13:54:55
【问题描述】:
我正在尝试获取序列的 n 个随机且不重叠的切片,其中每个子序列的长度为 l,最好按照它们出现的顺序。
这是我目前拥有的代码,每次尝试使其工作变得越来越混乱,不用说它不起作用。
def rand_parts(seq, n, l):
"""
return n random non-overlapping partitions each of length l.
If n * l > len(seq) raise error.
"""
if n * l > len(seq):
raise Exception('length of seq too short for given n, l arguments')
if not isinstance(seq, list):
seq = list(seq)
gaps = [0] * (n + 1)
for g in xrange(len(seq) - (n * l)):
gaps[random.randint(0, len(gaps) - 1)] += 1
result = []
for i, g in enumerate(gaps):
x = g + (i * l)
result.append(seq[x:x+l])
if i < len(gaps) - 1:
gaps[i] += x
return result
例如,如果我们说rand_parts([1, 2, 3, 4, 5, 6], 2, 2),它可以从下图中返回 6 个可能的结果:
[1, 2, 3, 4, 5, 6]
____ ____
[1, 2, 3, 4, 5, 6]
____ ____
[1, 2, 3, 4, 5, 6]
____ ____
[1, 2, 3, 4, 5, 6]
____ ____
[1, 2, 3, 4, 5, 6]
____ ____
[1, 2, 3, 4, 5, 6]
____ ____
所以[[3, 4], [5, 6]] 可以接受,但[[3, 4], [4, 5]] 不会,因为它重叠,[[2, 4], [5, 6]] 也不会,因为[2, 4] 不连续。
我在做一些代码打高尔夫球时遇到了这个问题,所以出于兴趣考虑,同时看到一个简单的解决方案和/或一个高效的解决方案,对我现有的代码不太感兴趣。
【问题讨论】:
-
我认为你应该尝试递归......
-
当有重复值时会发生什么?