获取长度为K的N个随机不重叠的子字符串

时间:2019-11-09 22:53:51

标签: python string random

假设我们有一个长度为20000(或另一个任意长度)的字符串R。我想从字符串R中获得8个长度为k的随机不重叠子字符串。

我试图将字符串R划分为8个相等长度的分区,并获得每个分区的[:k],但这不够随机,无法在我的应用程序中使用,并且无法轻松满足该方法的工作条件。

我想知道我是否可以使用内置的随机软件包来完成这项工作,但我想不出一种方法,该怎么办?

3 个答案:

答案 0 :(得分:0)

您可以简单地运行一个循环,然后在循环内部使用random包选择一个起始索引,并从该索引处提取子字符串。跟踪已使用的起始索引,以便可以检查每个子字符串是否不重叠。只要k不太大,它应该可以快速,轻松地工作。

我之所以提到k的大小,是因为如果它足够大,则可以选择不允许您找到8个非重叠子字符串的子字符串。但这仅在k相对于原始字符串的长度而言很大时才需要考虑。

答案 1 :(得分:0)

您可以使用while循环来强制唯一性:

import random
result, n, k = set(), 20000, 10
for _ in range(8):
  a = random.randint(0, n-k) 
  while any(a >= i and a <= i+k for i in result):
     a = random.randint(0, n-k) 
  result.add(a)

final_result = [(i, i+k) for i in result]

输出:

[(13216, 13226), (10400, 10410), (4290, 4300), (14499, 14509), (7985, 7995), (9363, 9373), (1181, 1191), (14526, 14536)]

答案 2 :(得分:0)

好吧,不需要做循环。如果我们想将字符串s分成每个长度为m的{​​{1}}个子字符串,则此问题等效于样本k子字符串之间的间隔,其总长度等于len(s )-m * k。

具有很好的离散分布,其属性是采样值总计为固定数量-Multinomial Distribution。这样,按时间间隔分割字符串就变得微不足道了,可以对其进行优化

代码,Python 3.7.5 Anaconda x64,Win10。

m+1