所以我试图通过think python解决这个练习:
练习6来自第12章:
最长的英文单词是什么,仍然是一个有效的英文单词, 当你一次删除一个字母时?
现在,可以从任何一端或中间删除字母,但是你 不能重新排列任何字母。每次你丢一封信,你 结束另一个英文单词。如果你这样做,你最终会 打算用一个字母结束,这也将成为一个字母 英语单词 - 在字典中找到的单词。我想知道是什么 最长的单词和它有多少个字母?
我将给你一个小小的例子:Sprite。好?你先来 你用精灵来取消一封信,一封来自内心 一句话,把r带走,我们留下了spite这个词,然后我们 把e带到最后,我们留下了唾液,我们把它关掉,我们就是 留下坑,它和我。
编写程序以查找可以通过这种方式减少的所有单词,以及 然后找到最长的一个。
我开始编写一些函数,但我仍然坚持使用check_dict函数:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def word_list(textfile='words.txt'):
res = {}
for word in open(textfile):
word = word.strip()
res[word] = word
return res
def children(s, wl):
i = 0
children = []
while i < len(s):
temp = s[:i] + s[i+1:]
if temp in wl:
children.append(temp)
i += 1
return children
def check_dict(s, wl, res = [], called = 0):
if len(s) == 1 and s in wl:
res.append(s)
return res
else:
for child in children(s, wl):
#print(res,'call number ', str(called), 'with s = ', s, 'whose children are: ', children(s, wl))
res.append(child)
check_dict(child, wl, res, called+1)
wl = word_list()
print(check_dict('at', wl))
我遇到的问题是它返回None而不是返回res的内容,除非我运行带有基本情况的函数,即s =&#39; a&#39;或者s =&#39;我&#39;。我知道这个函数贯穿每一条可能的路径,因此它应该返回几个不同的res,但我不太明白我怎么能让这个函数只打印一个从一路走来的res函数调用1个字母long s的参数,足以满足基本情况。
我知道这本书有一个解决方案,但我想知道我做错了什么以及如何修复我的版本。
答案 0 :(得分:0)
1你需要改变word_list函数,你的word_list函数给dict只有一个项目,其中key和value是相同的,即文件内容。更改函数以从input.txt文件获取单词列表
2在check_dict函数中,在if-else循环之外写入return函数,因为children(s,wl)函数返回空列表。
def word_list(textfile='input.txt'):
return open(textfile).read().strip().split(" ")
def children(s, wl):
i = 0
children = []
s_len = len(s)
while i < len(s):
temp = s[:i] + s[i+1:]
if temp in wl:
children.append(temp)
i += 1
return children
def check_dict(s, wl, res = [], called = 0):
if len(s) == 1 and s in wl:
res.append(s)
else:
for child in children(s, wl):
#print(res,'call number ', str(called), 'with s = ', s, 'whose children are: ', children(s, wl))
res.append(child)
check_dict(child, wl, res, called+1)
return res
wl = word_list()
a = check_dict('sprite', wl)