【问题标题】:How to remove a character from string after every loop in a while loop如何在while循环中的每个循环之后从字符串中删除一个字符
【发布时间】:2020-01-10 10:35:54
【问题描述】:

我正在尝试打印一个包含字母表中的字母的字符串。在用户猜到每个字母之后,该猜到的字母将从字母表中删除,然后在控制台中打印以显示尚未猜到的字母。

到目前为止,我已经尝试过 remove()translate()filter()。每次我尝试过,该字母都会成功删除,但是当需要删除另一个字母时,第一个字母会重新出现在字符串中,而第二个字母现在被删除了。基本上,字母不会被删除,只会在那个循环中消失。

背景信息:我正在 python3 中制作一个刽子手应用程序。因此,我遇到问题的部分代码位于函数中的 while 循环中。我正在 python3 中制作一个刽子手应用程序。因此,我遇到问题的部分代码位于函数中的 while 循环中。

alphabet = "abcdefghijklmnopqrstuvwxyz"
guess = " "

print("These letters haven't been guessed yet: " + alphabet.translate({ord(guess): None}))

预期结果:

(请注意,第二次输入后前一个不会再次出现。)

guess = input("Enter a letter: ")
Enter letter: a
These letters haven't been guessed yet: bcdefghi

guess = input("Enter a letter: ")
Enter letter: h
These letters haven't been guessed yet: bcdefgi

实际结果: (请注意,字母 'a' 在用户输入 'h' 后重新出现。)

guess = input("Enter a letter: ")
Enter letter: a
These letters haven't been guessed yet: bcdefghi

guess = input("Enter a letter: ")
Enter letter: h
These letters haven't been guessed yet: abcdefgi

【问题讨论】:

  • 26 个字符的布尔类型持有值的列表。每次猜测字符时,将它们设置为 True,这意味着它不能被使用。很简单。
  • 您没有重新分配字母表的值,只是打印没有字母的副本,所以字母当然仍然存在于实际变量本身中。尝试输入alphabet = alphabet.translate(...)
  • translate 返回一个修改后的 copy 它不会修改 alphabet 本身。你需要重新分配它。

标签: python python-3.x string loops


【解决方案1】:

您可以为此使用集合。首先,您创建一个包含字母表中所有字母的集合。此外,您想跟踪哪些是另一组中的猜测词。然后,每次用户猜测某个字母时,您将其添加到猜测集中。最后,您可以打印alphabet - guessed。最后,我只是使用''.join 以获得更好的输出格式。

alphabet = set("abcdefghijklmnopqrstuvwxyz")
guessed = set()

guess = "a"
guessed.add(guess)

print("These letters haven't been guessed yet: " + str(alphabet - guessed))
#Output: These letters haven't been guessed yet: {'c', 'd', 'y', 'r', 'i', 'h', 'g', 'o', 'q', 'x', 'v', 'k', 'j', 'z', 'p', 'n', 'u', 'm', 'l', 'b', 't', 'w', 'e', 'f', 's'}

print("These letters haven't been guessed yet: " + ''.join(alphabet - guessed))
#Output: These letters haven't been guessed yet: cdyrihgoqxvkjzpnumlbtwefs

@MrFuppes 更新:使用函数 sorted 按字母顺序打印集合中的元素

print("These letters haven't been guessed yet: " + ''.join(sorted(alphabet - guessed)))
#Output: These letters haven't been guessed yet: bcdefghijklmnopqrstuvwxyz

【讨论】:

  • 为了便于阅读,我会添加 sorted 并将其设为 f-string: print(f"These letters haven't been guessed yet: {' '.join(sorted(alphabet - guessed))}") ;-)
  • @MrFuppes,这个细节我没注意,谢谢。我还会在我的回答中添加您的修改。
  • 感谢大家的帮助!正是我需要的,完全忽略了字符串在 python 中是不可变的这一事实
【解决方案2】:

您也可以使用str.replace 方法(https://docs.python.org/3.6/library/stdtypes.html#str.replace),但是像上面一样,您必须重新分配字母表的值。

alphabet = alphabet.replace('a', '')

【讨论】:

    【解决方案3】:

    您遇到了问题,因为 python 中的字符串本质上是不可变的。这意味着您无法更改它们。请记住,使用 update 等基本上会更改变量引用的地址。所以我想你可能忘记更新代码中的字母表变量了。

    这是你可以做的 -

    alphabet = "abcdefghijklmnopqrstuvwxyz"
    guess = input("Enter a letter: ")
      CONSOLE - Enter a letter: a
    alphabet = alphabet.replace(guess, '')
    print('These letters haven\'t been guessed yet:', alphabet)
      CONSOLE - These letters haven't been guessed yet: bcdefghijklmnopqrstuvwxyz
    guess = input("Enter a letter: ")
      CONSOLE - Enter a letter: h
    alphabet = alphabet.replace(guess, '')
    print('These letters haven\'t been guessed yet:', alphabet)
      CONSOLE - These letters haven't been guessed yet: bcdefgijklmnopqrstuvwxyz
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 2015-11-16
      • 2018-11-22
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2015-01-15
      相关资源
      最近更新 更多