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

时间:2019-04-26 08:51:16

标签: python string random gradient

我有一组字符串,每个字符串有几百万个字符。我想将它们拆分为随机长度的子字符串,而我可以做到这一点而没有任何特殊问题。

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

  • 将字符串分成长度在1 * e04和8 * e06个字符之间的子字符串。
  • 做到这一点,脚本会为新生成的子字符串选择更长的长度(8 * e06)而不是较短的长度(1 * e04),例如长度递减的可能性梯度。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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,则需要决定是否要丢弃其余部分,或者在这种特殊情况下允许小于1e04的子字符串。

我确信在效率方面可以进行很多改进,这只是让您对我的方法有所了解。