字谜问题

2 投票
4 回答
1412 浏览
提问于 2025-04-17 02:53

我写了一个函数,这个函数可以接收一个单词和一串“禁止使用”的字母,如果这个单词没有使用任何这些字母,就返回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

4 个回答

1

在这段代码中

for letter in word:
  if forbidden in word:

你应该这样做

for letter in forbidden:
  if letter in word:

你想要做的是检查用户输入的每一个字母,看看它是否在从文件中读取的单词里。如果在,就跳过这个单词,继续下一个。虽然有更“python风格”的写法,但我觉得这样写清晰易懂。

2

我猜……

你在用的是 Python 2.x 版本。

当你运行程序时,你输入了:

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

在 Python 2.x 中,你应该使用 raw_input 而不是 input。这样可以得到你输入的内容的字符串。因为如果用 input,Python 会试图把你输入的内容当作 Python 表达式来解析,这样做是很危险的,通常也不是个好主意。

你的第二个问题是,你把第一段代码中的 letter in forbidden 反过来了,变成了 forbidden in word,这两者是完全不同的。

2
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> 正如winston所说,使用 raw_input

2> 如果你想遍历一个字符串,可以用 list(your_string) 来获取一个字符列表

3> 这里的 else 只有在我们的 for letter in list(word) 循环完成且没有遇到 break 的情况下才会执行(换句话说,就是没有字母在禁止的范围内)

撰写回答