gpt4 book ai didi

python - N 个随机、连续且不重叠的子序列,每个子序列的长度

转载 作者:行者123 更新时间:2023-12-02 09:35:37 25 4
gpt4 key购买 nike

我正在尝试获取序列的 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]] 不会' t 因为它是重叠的,并且 [[2, 4], [5, 6]] 也不会因为 [2, 4] 不连续。

我在进行一些代码高尔夫时遇到了这个问题,因此出于利益考虑,看到一个简单的解决方案和/或一个高效的解决方案也很好,对我现有的代码不太感兴趣。

最佳答案

def rand_parts(seq, n, l):
indices = xrange(len(seq) - (l - 1) * n)
result = []
offset = 0
for i in sorted(random.sample(indices, n)):
i += offset
result.append(seq[i:i+l])
offset += l - 1
return result

要理解这一点,首先考虑l == 1的情况。然后它基本上只是按排序顺序返回输入数据的 random.sample() ;在这种情况下,offset 变量始终为 0。

l > 1 的情况是前一种情况的扩展。我们使用 random.sample() 来选取位置,但保持偏移量来移动连续结果:通过这种方式,我们确保它们是不重叠的范围 - -- 即它们开始时彼此的距离至少为 l,而不是 1。

关于python - N 个随机、连续且不重叠的子序列,每个子序列的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com