【问题标题】:Python: add a number of random letters (A-Z; a-z) after each letter in a given word?Python:在给定单词的每个字母之后添加一些随机字母(A-Z;a-z)?
【发布时间】:2016-02-10 10:23:11
【问题描述】:

我需要编写一个程序,在提供的单词中的每个字母之后添加一些随机字母。

这是我所拥有的:

import random
import string

def add_letters(word,number):

    for i in range(number):
        letters=''.join(random.choice(string.ascii_letters))         
        new_word=(letters.join(word))
    return new_word

如果我们输入 add_letters(cat,1),输出应该是这样的:

cZaQtR

即使我给它一个不同的数字,我的程序也总是返回 1 个字母。此外,单词中的每个字母后面总是相同的“随机”字母。

知道我做错了什么吗?

【问题讨论】:

    标签: python string random


    【解决方案1】:

    这里有很多逻辑错误,还有一些笨拙的编码(但不要担心,你会在练习中变得更好)

    • 在每个循环中,您的 new_word 都会被删除
    • 您正在为 new_word 分配一个生成的字母加上原始单词,这不是您想要做的。
    • 无需使用''.join

    正确的答案应该是这样的:

    def add_letters(word,number):
        new_word = ""
        for c in word: # iterate through the word
            letters = ""
            for k in range(number): # concatenate n random letters
                letters += random.choice(string.ascii_letters)   
            new_word += c + letters # add the current char plus the letters to the new word
    return new_word
    

    【讨论】:

      【解决方案2】:

      你的逻辑不正确。我建议在你的循环中添加一些调试打印输出,看看你得到了什么,如下所示:

      for i in range(number):
          letters=''.join(random.choice(string.ascii_letters))         
          new_word=(letters.join(word))
          print i, letters, word, new_word
      

      这应该告诉你哪里出错了。作为额外提示,您可以在第一个循环之外使用第二个循环。

      【讨论】:

        【解决方案3】:

        您永远不会在每次迭代中维护您添加的字母。

        您在每次迭代时都执行new_word=(letters.join(word)),这将永远不会保留先前迭代中的随机字母,并且使用 'something'.join('another something') 将在 'another 的每个字符之间添加 'something'东西'。

        相反,您想看的内容更像是

        def add_letters(word, number):
            new_word = ''
        
            for character in word:
                new_word += character
                for _ in range(number):
                    new_word += random.choice(string.ascii_letters)
        
            return new_word
        

        它将遍历所提供单词的每个字符,将其添加到new_word 字符串中,然后根据需要随机选择尽可能多的字符并将它们添加到new_word,并继续直到原始单词完成,并且返回新词。

        【讨论】:

          【解决方案4】:

          当您进入循环时,您的问题就发生了,您一次最多只能生成一个随机字符:

          letters=''.join(random.choice(string.ascii_letters))
          

          您可能想以不同的方式看待您的问题,而是随机使用另一种称为sample的方法

          使用 sample,您可以在每次调用时提供所需的随机字符数,并且它们将是唯一的。这实际上将您的循环更改为遍历您的 number,而不是遍历该单词并相应地添加您的字符。

          import random
          import string
          
          def add_letters(word,number):
              new_word = ""
              for i in word:
                  letters = ''.join(random.sample(string.ascii_letters, number))
                  new_word += "{}{}".format(i, letters)
              return new_word
          

          调用:

          add_letters('cat', 2)
          

          输出:

          cNbarHtTM
          

          【讨论】:

            【解决方案5】:
            import random
            import string
            
            def add_letters(word,number):
                """
                Adds "number" randomly selected ASCII letters to the end of "word"
                """
            
                return word + "".join([random.choice(string.ascii_letters) for k in range(number)])
            
            
            for i in range(10):
                print(add_letters("foo", i))
            

            [random.choice...] 是一个列表理解。它们是 Python 中一个非常酷且功能强大的东西,如果你不完全理解代码,我建议你阅读一下。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-25
              • 2016-03-04
              • 2012-07-25
              相关资源
              最近更新 更多