【问题标题】:Generate Random String with three alphabets of different lengths in Python在Python中生成具有三个不同长度字母的随机字符串
【发布时间】:2018-09-08 18:40:30
【问题描述】:

如何生成一个包含三个整数 A、B 和 C 的随机字符串,其中恰好包含 A 字母“a”、B 字母“b”和 C 字母“c”?

def generate_string(A, B, C):
    // return a string

s = generate_string(2, 5, 1)
// outputs can be
aabbbbbc 
ababbbcb
abcabbbb
and so on....

但是,我能够使用 python random.choice() 函数实现这种功能。

>>> print(''.join(choice('a'+'b'+'c') for i in range(5)))
aacaa

【问题讨论】:

  • 你的问题是什么?
  • @BlackThunder 我已经编辑了我的问题。

标签: python string python-3.x random


【解决方案1】:

复杂度为 O(a+b+c),但可行:

from random import shuffle

a = 3
b = 4
c = 5
letters = []

for i in range(a):
  letters.append('a')
for i in range(b):
  letters.append('b')
for i in range(c):
  letters.append('c')

shuffle(letters)
print(''.join(letters))

【讨论】:

    【解决方案2】:

    试试这个:

    from random import choice
    
    options = {'a': 2, 'b': 5, 'c': 1}
    gen_chars = []
    while options:
        genc = choice(''.join(options.keys()))
        options[genc] -= 1
        if options[genc] == 0:
            options.pop(genc)
        gen_chars.append(genc)
    
    print(''.join(gen_chars))
    

    【讨论】:

    • 好,现在您需要从所有答案中选择一个来接受更符合您需求的答案。
    【解决方案3】:

    这样做的一种方法是创建一个包含这些字符的字符串,然后从该字符串中sample 对其进行洗牌:

    from random import sample
    
    s = 'a'*2 + 'b'*5 + 'c'*1
    
    print(''.join(sample(s, k=len(s))))
    

    根据您的评论,函数可能类似于

    from itertools import repeat, chain
    from random import shuffle
    
    def generate_string(*pairs):
        chars = list(chain.from_iterable(repeat(c, n) for n, c in pairs))
        shuffle(chars)
        return ''.join(chars)
    
    print(generate_string((2, 'a'), (5, 'b'), (1, 'c')))
    

    如果你只担心这三个字符,这可以简化为

    def generate_string(a, b, c):
        s = 'a'*a + 'b'*b + 'c'*c
        return ''.join(sample(s, k=len(s)))
    

    【讨论】:

    • 但这并不能保证每个生成的字符串都会有2个a、5个b和1个c。
    • 你做的与我想要达到的相反。假设有一个函数将三个整数(字符长度)作为输入,并根据这些长度生成一个字符串。 def generate_string(length_a, length_b, length_c): // return a strings = generate_string(2, 5, 1) //output aabbbbbc ababbbcb abcabbbb
    • @DeepSpace 是的吗? sample 选择不替换,所以我们不能得到比人口更多的东西。
    【解决方案4】:

    功能:

    def generate_string(A,B,C):
        from random import sample as sp
        return "".join(sp(("a"*A)+("b"*B)+("c"*C),A+B+C))
    

    使用:

    >>> generate_string(2,3,1)
    'baacbb'
    >>> generate_string(2,3,1)
    'bcbaba'
    >>> generate_string(5,1,1)
    'baaacaa'
    >>> generate_string(2,5,1)
    'cbababbb'
    >>> 
    

    【讨论】:

      【解决方案5】:

      您必须检查变量 A、B 和 C 是否为 int:

       import random
       def generate_string(A, B, C):
           _list = list("a"*A + "b"*B + "c"*C)
           random.shuffle( _list)
           return "".join(_list)
      

      【讨论】:

        猜你喜欢
        • 2018-01-25
        • 2016-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-03
        • 2011-02-17
        相关资源
        最近更新 更多