【问题标题】:Generate all strings up to desired length生成所需长度的所有字符串
【发布时间】:2012-09-16 17:10:21
【问题描述】:

我想生成长度从 1 到 max_length 的所有随机字符串。 python中是否有内置函数可以做到这一点?如果没有,请告诉我如何执行此操作或将我引导至涵盖此类问题的帖子。提前致谢。

【问题讨论】:

  • 这不是真正的“随机”字符串,而是 所有 字符串,对吧?
  • 可以找到一个解决方案here
  • 这与要求所有从 1 到 max_length 变化的字符串相同(随机性与此无关,因为您将在此过程中遇到所有可能的字符串)。
  • 对于即使是很小的 max_length 值,也有 很多 个字符串,尤其是当您考虑所有可能的 unicode 字符时。您确定要生成所有个吗?为什么需要这个?
  • 有 256**N 个长度为 N 的不同字符串。为什么要生成所有这些字符串来计算呢?

标签: python python-3.x python-2.7


【解决方案1】:

随机字符串:

import random
def get_random_string(alphabet, slen):
    return ''.join(random.choice(alphabet) for _ in xrange(slen))

print get_random_string('0123456789', 5) # prints e.g. 62247

所有字符串按字典顺序排列(感谢@DSM 提醒我itertools):

import itertools
def gen_all_strings(alphabet, slen):
    it = itertools.product(alphabet, repeat=slen)
    return (''.join(s) for s in it)

print list(gen_all_strings('abc', 2)) # prints ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc']

【讨论】:

  • def gen_all_strings(alphabet, slen): return (''.join(w) for w in itertools.product(alphabet, repeat=slen)),不是吗?顺序变化除外。
  • 有时,我忘记了itertools 的存在......你说得对,这是一个更短的解决方案。 (如果你想让它们按顺序使用,你可以使用 [::-1])
【解决方案2】:

你可以使用random.sample():

In [28]: from string import ascii_lowercase as asl

In [29]: import random

In [30]: max_length=10

In [31]: for x in xrange(1,max_length+1):
   ....:     ''.join(random.sample(asl,x))
   ....:     
   ....:     
Out[31]: 'k'
Out[31]: 'jy'
Out[31]: 'ldo'
Out[31]: 'ivlr'
Out[31]: 'gqelt'
Out[31]: 'gbvnqw'
Out[31]: 'baestog'
Out[31]: 'kyijhmvn'
Out[31]: 'toshxklwb'
Out[31]: 'wihtmouexg'

【讨论】:

  • 次要 nitpick:random.sample 返回 unique 元素,因此字符串是字母表的随机排列子集(如果 max_length > len(ascii_lowercase) 将失败)。
  • 不,我认为@nneonneo 正在了解 OP 确实想要每个可能的单词,而不仅仅是字母表某个子集的每个可能的洗牌。例如,你永远不会得到“aa”。
猜你喜欢
  • 2012-02-28
  • 2011-12-04
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 2019-05-10
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多