【问题标题】:How to generate unique letters and append them to a string in python?如何生成唯一的字母并将它们附加到python中的字符串?
【发布时间】:2021-10-27 16:17:48
【问题描述】:

我目前正在编写一个代码,用户需要输入至少 4 到 12 个字母的输入字符串,不能包含任何数字并且必须是唯一的。一旦所有三个条件都通过,程序将生成一组字母,其中包括输入字符串和其他唯一字母,以形成输入字符串长度的两倍。我已经清除了所有三个条件,但不确定如何生成唯一字母并将它们附加到输入字符串。

def main2():
    player_input = input("Enter target letters: ").upper() 
    if  4 <= len(player_input) < 12 \
        and len(set(player_input)) == len(player_input) \
             and player_input.isalpha():
                  print(player_input)
    
    elif not 4 <= len(player_input) < 12:
         print(f"Must be unique characters from and of length 4 to 12")
    elif len(set(player_input)) != len(player_input):
         print(f"Must be unique characters from and of length 4 to 12")
    elif not player_input.isalpha():
         print(f"Must be unique characters from and of length 4 to 12")
    else:
         print(player_input)        
main2()

【问题讨论】:

    标签: python string random append


    【解决方案1】:

    如果您提供示例输入和所需结果的示例,将会有所帮助。

    您可以利用random 库中的choice 函数来选择一个随机值。和string 库,用于此任务的字母快速列表。然后使用while 循环来搜索唯一的字母。

    import random
    import string
    
    player_input = 'WORD'
    letters = string.ascii_uppercase  # Letters of the alphabet
    
    result = player_input
    while len(result) < len(player_input) * 2:  # Add letter until equal length
        ltr = random.choice(letters)
        if ltr not in player_input:  # Check that random letter is unique.
            result += ltr
    

    示例结果:

    WORDZLNX

    我还建议您使用while 循环对player_input 进行条件检查。

    【讨论】:

      【解决方案2】:

      append python 函数是你最好的选择。像这样的东西: https://www.javatpoint.com/python-program-to-generate-a-random-string 至于添加到用户输入末尾的数字的长度,您必须创建一个函数来获取用户输入的长度并将其乘以 2 以获得所需的长度。

      【讨论】:

      • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
      【解决方案3】:

      我已经修改了你的代码来做到这一点:

      from random import randint
      
      def main2():
          player_input = input("Enter target letters: ").upper()
          if  4 <= len(player_input) < 12 \
              and len(set(player_input)) == len(player_input) \
                   and player_input.isalpha():
      
                        letters = {chr(i) for i in range(65, 91)}
                        lettersNotInInput = list(letters - set(player_input))
                        for i in range(len(player_input)):
                            newLetter = lettersNotInInput.pop(randint(0, len(lettersNotInInput)))
                            player_input += newLetter
                        print(player_input)
      
          elif not 4 <= len(player_input) < 12:
               print(f"Must be unique characters from and of length 4 to 12")
          elif len(set(player_input)) != len(player_input):
               print(f"Must be unique characters from and of length 4 to 12")
          elif not player_input.isalpha():
               print(f"Must be unique characters from and of length 4 to 12")
          else:
               print(player_input)
      main2()
      

      它是如何工作的:

      • 创建一组从“A”到“Z”的字母(使用 ascii 代码,因此我不必对字母表进行硬编码

      • 执行集合减法以从生成列表lettersNotInInput的集合中删除输入中的字母

      • 然后它循环 player_input 的长度,有效地将长度加倍

      • 从列表中随机弹出一个字母(确保只能选择一次)并将其添加到player_input

      【讨论】:

        【解决方案4】:

        首先我认为您的代码可以通过使用正则表达式进行检查而不是堆叠 if/elifs 来清理很多。

        现在这些附加的字母对于整个字符串是唯一的吗?或者只是这个附加的子字符串?我的一般建议,可能有更好的方法来做到这一点,是生成一个随机唯一数字列表(网上有很多参考资料可以做到这一点),范围为 97-122,一旦你完成转换这些使用“chr()”将数字转换为字符 - 将数字转换回字符。然后使用“.join”将此字符列表转换为字符串,然后您可以将此字符串附加到已读入的现有字符串中。同样可能有更好/更有效的方法来执行此操作,因此如果您的应用程序需要高度优化可能会尝试其他方法。

        from random import random, choice, sample
        import re
        
        string_req = re.compile(r'^[a-zA-Z]{4,12}$') 
        in_str = input("Enter your string: ")
        match = string_req.match(in_str)
        if match:
            match_str = match.group()
            unique_list = sample(range(97, 122), len(match_str))
            # Turn all numbers back into characters
            unique_str = "".join([chr(c) for c in unique_list])
            # Randomally capitalize some so that capitals are factored in
            out_str = match_str + "".join((choice((str.upper, str.lower))(c) for c in unique_str)))
        else:
            print('No match')
        

        另请注意 - 此代码仅检查附加部分中的字母是否唯一 - 如果您希望以另一种方式,其中值对于整个字符串是唯一的,那么您将需要从输入字符串,并将其包含在选项中。

        【讨论】:

          【解决方案5】:

          试试这个:

          import random
          import string
          
          def main2():
              player_input = input("Enter target letters: ").upper()
          
              playerlen=len(player_input) # Length of the player_input
              playersetlen=len(set(player_input)) # Length of set
              isalfa=player_input.isalpha() # True/False result of isalpha()
          
              if  4 <= playerlen < 12 and playersetlen == playerlen and isalfa:
                  print(player_input+"".join(random.choices(string.ascii_uppercase,k=playerlen)))
          
              elif playerlen<4 or playerlen > 12 or playersetlen != playerlen or isalfa==False:
                   print(f"Must be unique characters from and of length 4 to 12")
          
              else:
                   print(player_input)
          main2()
          

          主要是:

          "".join(random.choices(string.ascii_uppercase,k=playerlen))
          

          这基本上是从 [A-Z] 中选择 5 个大写字符并将这些字符连接起来。

          您的代码中的其他更改只是为了使代码更简单、更快。您正在做多次相同的事情,所以我已经将它们更改为一些变量,现在如果我们必须使用该函数,那么我们可以使用那些分配的变量。而且我已经删除了其他elif 条件并将所有条件添加到一个中,您只是在所有条件中打印相同的内容,所以我这样做了。现在不确定何时会出现else 条件,但我没有更改任何else 条件。但我相信,elif 只能替换为else 条件。

          【讨论】:

            猜你喜欢
            • 2017-12-09
            • 2011-08-18
            • 1970-01-01
            • 1970-01-01
            • 2021-10-28
            • 1970-01-01
            • 1970-01-01
            • 2014-12-28
            • 1970-01-01
            相关资源
            最近更新 更多