【问题标题】:Word Play Question文字游戏问题
【发布时间】:2011-09-22 23:12:20
【问题描述】:

我创建了一个函数,它接受一个单词和一串“禁止”字母,如果单词不使用任何字母,则返回 True。

def avoids(word,forbidden):
    for letter in word:
        if letter in forbidden:
            return False
    else:
        return True

我想修改它,而不是使用“禁止”作为要避免的字母,而是提示用户放置几个字母并打印不包含任何字母的单词数。我还有一个 .txt 文档,其中包含这些单词以使其变得有趣。

这是我想出的错误。如果可能的话,我希望得到一些帮助和教育,因为我的“在线”老师从来不在身边提供帮助。请帮忙:)

def word_no_forbidden():
    forbidden = input('pick 5 letters')
    fin = open('words1.txt')
    no_forbidden_word = 0
    for line in fin:
        word = line.strip()
        for letter in word:

            if forbidden in word:
                continue
            print word

这是我得到的错误,我理解它,但是我不确定如何处理这个......

  Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
     word_no_forbidden()
  File "C:/Python27/test.py", line 9, in word_no_forbidden
     if forbidden in word:
  TypeError: 'in <string>' requires string as left operand, not tuple

【问题讨论】:

  • 旁注:特别是在发布 Python 代码时,确保保留缩进是值得的。粘贴代码后,选择您粘贴的代码并单击编辑器的{} 按钮或输入 Ctrl+K 将生成一个与您粘贴的缩进相同的代码块。
  • 注意你的原始函数可以写成return any(letter in forbidden for letter in word)return set(word).isdisjoint(forbidden)
  • @JohnFlatness 我在这个网站上显然是文盲。很抱歉我没有缩进......下次我一定会这样做。
  • 您为forbidden 输入了什么确切?你使用的是哪个版本的 Python?
  • @agf 我输入了:'a','b','c','d','e' 然后我想禁止等于这 5 个字母并从 .txt 中打印出单词没有这些字母的文件。我正在使用 python 2.7

标签: python file for-loop


【解决方案1】:
def word_no_forbidden():
    forbidden = raw_input('pick 5 letters')
    fin = open('words1.txt')
    no_forbidden_word = 0
    for line in fin:
        word = line.strip()
        for letter in list(word):
            if letter in forbidden:
                break
        else:
            print word

注意:

1> 正如温斯顿所说,使用raw_input

2> 如果您想遍历字符串,请使用list(your_string) 获取字符列表

3> 这里的else 仅在我们的for letter in list(word) 循环完成而不会中断时执行(换句话说,没有一个字母被禁止)

【讨论】:

  • 这是我正在寻找的输出!你介意解释列表中的字母(单词):如果禁止字母:打破其他:打印单词
  • 我仍然无法理解“遍历”这个概念。所以你遍历一个字符串,你输入 list(your_string) 总是这样吗?请原谅我的文盲,你如何在评论中隐藏 'list(your_string)?
  • @G.G :关于对代码进行着色,请单击您在评论框附近看到的小帮助按钮
  • 为什么我们需要在 word = line.strip() 时遍历字符串,这对我来说意味着..对于 word 中的每个字母:如果该字母在禁止 (abcde) 中,我们将忽略。在这一点上,你做了一个休息......输出是否“继续”相同并排除 else: 并且只打印单词?
  • 我认为你混淆了 split() 和 strip()。无论如何,两者都不适合您。关于休息和继续,阅读this
【解决方案2】:

我的猜测...

你是python 2.x

当你运行你输入的程序时:

'a','b','c','d'

在 python 2.x 上,您想使用 raw_input 而不是 input。这将给出一个与您输入的内容完全相同的字符串。因为它是 python 会尝试将您正确的任何内容解释为 python 表达式,这很危险并且通常是一个坏主意。

您的第二个问题是您将代码行与第一个示例 letter in forbidden 颠倒了,所以它变成了 forbidden in word 不是一回事。

【讨论】:

  • 明白。我更了解。我只是绝望了:/
【解决方案3】:

要从用户那里读取字符串,您应该使用raw_input,而不是inputinput 尝试将用户键入的字符串实际评估为 Python 代码,并可能导致您获得您不期望的数据类型(或其他更糟糕的事情)。

相比之下,raw_input 总是返回一个字符串。

(注意:这仅适用于 Python 2.x。从 Python 3 开始,raw_input 被重命名为 input,并且没有函数可以执行 input 以前的功能。)

【讨论】:

  • 谢谢,约翰。我一直想知道这两者之间是如何运作的。我现在会记得的。
【解决方案4】:

在这部分代码中

for letter in word:
  if forbidden in word:

你应该这样做

for letter in forbidden:
  if letter in word:

您要做的是检查用户输入的每个字母,如果它在从文件中读取的单词中,则跳过该单词并转到下一个。有更多的pythonic方法可以做到这一点,但我认为这很清楚易懂。

【讨论】:

  • 这很有意义,我很欣赏这个解释。当我这样写时,我仍然收到所有带有我不想产生的字母的单词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多