【问题标题】:Validate word uses letters only from random list验证单词仅使用随机列表中的字母
【发布时间】:2017-10-03 11:39:30
【问题描述】:

我正在用 Python 构建一个“拼字游戏”。基本上,给用户 7 个随机生成的字母,这些字母存储在列表 random_letters 中。然后他们使用这些字母输入一个单词 - 这是一个存储为 player1_word 的字符串。

我坚持的一点是我需要验证用户输入了一个有效的单词 - 例如 player1_word 仅使用来自 random_letters 的字母。

def is_valid_answer(player_word: str, letters: list) -> bool:
    ...

预期行为:

>>> random_letters = ["D", "O", "G", "P", "X", "K"]
>>> is_valid_answer("DOG", random_letters)
True
>>> is_valid_answer("CAT", random_letters)
False

【问题讨论】:

  • 你能展示你尝试了什么吗?
  • 先展示你的方法
  • 您的问题是:“如何确定字符串word 是否仅包含某个列表中的字符?”
  • 从问题中不清楚你的问题是什么。
  • 我做了一个相当大的重写,以使问题更清晰,更符合 Python 风格,请询问我是否有任何更改,您不确定。

标签: python string


【解决方案1】:

您可以使用set 操作来做到这一点:

if not set(Player1Word) - set(randomLetters):
    print "Valid"

set 是一个只包含唯一项的数据结构。这个想法是,转换他们两个集合。然后,从Player1Word 中减去randomLetters 以查看Player1Word 是否包含randomLetters 中没有的内容。如果不包含,则Player1Word 有效,否则无效。

【讨论】:

  • 谢谢,这很完美,正是我想要的。以前从来不知道“set”,从来没有遇到过。非常感谢;)
  • 这个答案有一个微妙的问题。例如,如果给我字母 A、E、O、D、T、W、X 并提供答案 WOOD,您的代码将报告我的答案是有效的,而不是。
  • @gz。确实如此,好地方。没有彻底测试是我的坏事!关于如何解决这个问题的任何想法?
  • @sf318 让其他人有机会修复/回答,但现在已经发布了解决方案。
【解决方案2】:
randomLetters = [ 'a' , 'b' , 'x']

word = input('Enter A word : ')
first_letter = word[0]
if first_letter in randomLetters:
  print('valid')
else:
  print('Not valid')

结果

Enter A word :  alex
valid

Enter A word :  devon
Not valid

【讨论】:

    【解决方案3】:

    Python does not have a native multiset type 所以这不是一个简单的方法,但collections.Counter 有点帮助:

    def is_valid_answer(word, letters):
        letter_counts = collections.Counter(letters)
        for letter in word:
            if not letter_counts[letter]:
                return False
            letter_counts[letter] -= 1
        return True
    

    使用Counter 至少可以为您节省使用计数填充普通dict 所需的循环。

    【讨论】:

    • 感谢发帖,有机会会尽快测试:)
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 2022-01-07
    • 2017-07-10
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多