如何在Python中将一组字符串拆分为子字符串,从而更可能缩短子字符串?

问题描述 投票:1回答:2

我有一组字符串,每个字符串都有数百万个字符。我想把它们分成随机长度的子串,这个我可以做没有特别的问题。

但是,我的问题是:如何在子串长度选择中应用某种权重?我的代码在python3中运行,所以我想找到一个pythonic解决方案。详细地说,我的目标是:

  • 将字符串拆分为长度在1 * e04和8 * e06个字符之间的子字符串。
  • 这样做,脚本在新生成的子串中选择较长的长度(8 * e06)的短长度(1 * e04),如下降长度似然梯度。

谢谢您的帮助!

python string random gradient
2个回答
1
投票

可能有很多方法可以做到这一点。我会这样做:

  1. rand区间取一个随机数[0,1]import random rand = random.random()
  2. 对该数字使用操作可以更小的数字,但保持在[0,1]的范围内。您使用什么操作取决于您希望可能性分布的样子。一个简单的选择就是广场。 rand = rand**2
  3. 将数字空间[0,1]缩放到[1e04, 8e06]并舍入到下一个整数: subStringLen = round(rand*(8e06-1e04)+1e04)
  4. 从字符串中获取长度为subStringLen的子字符串,并检查剩余的字符数。 如果剩下的是8e06以上的字符,请转到第1步。 如果1e048e06之间存在,请将它们用作最后​​一个子串。 如果小于1e04,你需要决定是否要抛弃其余部分,或者在这个speciel案例中允许小于1e04的子串。

我确信在效率方面有很多改进,这只是为了让你了解我的方法。


2
投票

NumPy提供许多random采样功能。看看各种distributions可用。

如果你正在寻找一些重量较低的东西,那么exponential distribution可能会起作用吗?

使用matplotlib,您可以绘制值的直方图,这样您就可以更好地了解分布是否符合您的要求。

所以像这样:

import numpy as np
import matplotlib.pyplot as plt

# desired range of values
mn = 1e04
mx = 8e06

# random values following exp distribution
values = np.random.exponential(scale=1, size=2000)

# scale the values to the desired range
values = ((mx-mn)*values/np.max(values)) + mn

# plot the distribution of values
plt.hist(values)
plt.grid()
plt.show()
plt.close()
© www.soinside.com 2019 - 2024. All rights reserved.