字谜问题
我写了一个函数,这个函数可以接收一个单词和一串“禁止使用”的字母,如果这个单词没有使用任何这些字母,就返回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 的情况下才会执行(换句话说,就是没有字母在禁止的范围内)