艰苦学习Python练习48帮助
我正在努力学习Python,并通过练习48实现了挑战。您将获得大量代码作为单元测试,并要求我们创建一个函数以使单元测试通过。我不确定这段代码到底应该是什么样子。我粘贴了其中一个函数作为引用。它们看起来都很像这一个,我相信如果我知道如何通过这一个,我可以找出其余的。谢谢大家艰苦学习Python练习48帮助,python,python-2.7,Python,Python 2.7,我正在努力学习Python,并通过练习48实现了挑战。您将获得大量代码作为单元测试,并要求我们创建一个函数以使单元测试通过。我不确定这段代码到底应该是什么样子。我粘贴了其中一个函数作为引用。它们看起来都很像这一个,我相信如果我知道如何通过这一个,我可以找出其余的。谢谢大家 from nose.tools import * from ex48 import lexicon def test_directions(): assert_equal(lexicon.scan("north")
from nose.tools import *
from ex48 import lexicon
def test_directions():
assert_equal(lexicon.scan("north"), [('direction', 'north')])
result = lexicon.scan("north south east")
assert_equal(result, [('direction', 'north'),
('direction', 'south'),
('direction', 'east')])
以下是我的穴居人Python解决方案:
def scan(data):
data = data.split()
results = []
for l in data:
if l in directions:
results.append(('direction', l))
elif l in verbs:
results.append(('verb', l))
elif l in stop_words:
results.append(('stop', l))
elif l in nouns:
results.append(('noun', l))
elif convert_number(l) in numbers:
results.append(('number', convert_number(l)))
else:
results.append(('error', l))
return results
这是《艰苦学习Python》中练习48的完整解决方案
directions = ['north', 'south', 'east']
stops =["the" , "in" , "of"]
verbs = ['go','stop','kill','eat' ]
numbers = xrange(999999999)
nouns=["bear" , "princess" ]
list_of_lists=['go','stop','kill','eat','north', 'south', 'east','door',"the" , "in" , "of","bear" , "princess",xrange(999999999)]
list99=[]
class lexicon:
@staticmethod
def scan(d):
list2=d.split()
list1=[]
list3=[]
try:
for x in d.split():
if int(x) in xrange(999999999):
a = x
list1.append(a)
list2.remove(a)
else:
print "yes"
except:
list99=[]
for x in d.split():
#print x
if x in nouns:
z1 = ("noun" , x)
list3.append(z1)
elif x in directions:
z2 = ("direction" , x)
list3.append(z2)
elif x in verbs:
z2 = ("verb" , x)
list3.append(z2)
elif x in list1:
z2 = ("number" , int(x))
list3.append(z2)
elif x in stops:
z2 = ("stop" , x)
list3.append(z2)
elif x in list2:
z2 = ("error" , x)
list3.append(z2)
else:
print "yes"
print "d:%s"%d.split()
print "list1:%s"%list1
print "list2:%s"%list2
print "list3:%s"%list3
return list3
我也在做这个练习,我花了几天时间才把它做好(至少我认为它是对的)。 说到编程,我是个彻头彻尾的傻瓜,我想和大家分享我的解决方案,从你们那里得到反馈,看看它是否能把工作做好。 提前感谢您的帮助
nouns = ['door', 'bear', 'princess', 'cabinet']
directions = ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back']
verbs = ['go', 'stop', 'kill', 'eat']
stops = ['the', 'in', 'of', 'from', 'at', 'it']
list_of_lists = [nouns, directions, verbs, stops]
def scan(sentence):
split_sentence = sentence.split()
# print split_sentence
list1 = []
list2 = []
length_of_list = len(split_sentence)
counter = 0
while counter < length_of_list:
for x in split_sentence:
try:
if int(x) in xrange(999999999):
tuple = ("numbers", x)
list1.append(tuple)
split_sentence.remove(x)
counter += 1
else:
# print "yes"
counter += 1
except:
# print "no numbers"
# print x
counter += 1
for i in split_sentence:
for j in list_of_lists:
if i in j:
for k, v in list(globals().iteritems()):
if j is v:
tuple = (k, i)
list1.append(tuple)
# print list1
else:
pass
else:
pass
print list1
scan = scan("door bear north south go stop the in 23 9000000")
scan
名词=[“门”、“熊”、“公主”、“橱柜”]
方向=[‘北’、‘南’、‘东’、‘西’、‘下’、‘上’、‘左’、‘右’、‘后’]
动词=['go','stop','kill','eat']
停止=['the','in','of','from','at','it']
列表中的列表=[名词、方向、动词、停止]
def扫描(句子):
split_句子=句子.split()
#打印拆分句子
列表1=[]
列表2=[]
列表长度=len(分句)
计数器=0
当计数器<列表的长度\u时:
对于拆分句子中的x:
尝试:
如果int(x)在xrange(999999999)中:
元组=(“数字”,x)
列表1.append(元组)
拆分句子。删除(x)
计数器+=1
其他:
#打印“是”
计数器+=1
除:
#打印“无数字”
#打印x
计数器+=1
对于拆分句子中的i:
对于_列表中的_中的j:
如果我在j中:
对于列表中的k,v(globals().iteritems()):
如果j是v:
元组=(k,i)
列表1.append(元组)
#打印列表1
其他:
通过
其他:
通过
打印列表1
scan=scan(“门熊南北行停止在23 9000000”)
扫描
以下代码适用于除test\u errors()测试用例(lexicon\u测试中的最后一个测试用例)之外的所有测试用例。请将以下代码放入lexicon.py中。注释lexicon_tests.py中的test_errors()函数并运行测试
lexicon.py:
from itertools import izip
direction = {'north':('direction','north'), 'south':('direction','south'),'east':('direction','east'), 'west':('direction','west')}
verbs = {'go':('verb', 'go'), 'stop':('verb', 'stop'), 'kill':('verb', 'kill'), 'eat':('verb', 'eat')}
stop = {'the':('stop','the'), 'in':('stop','in'), 'of':('stop','of'), 'from':('stop','from'), 'at':('stop','at'), 'it':('stop','it')}
nouns = {'door':('noun','door'),'bear':('noun','bear'),'princess':('noun','princess'),'cabinet':('noun','cabinet')}
numbers = {'1234':('number', 1234),'3':('number', 3),'91234':('number', 91234)}
class lexicon(object):
def scan(self, sentence):
self.flag=''
self.list_var=[]
self.sentence = sentence
self.words =self.sentence.split()
for k1,k2,k3 in izip(direction,verbs,nouns):
self.j=0
while self.j < len(self.words):
if direction[k1][1] == self.words[self.j] :
self.flag='d'
break
elif verbs[k2][1] == self.words[self.j] :
self.flag='v'
break
elif nouns[k3][1] == self.words[self.j] :
self.flag='n'
break
self.j=self.j+1
for k4 in numbers:
self.j=0
while self.j < len(self.words):
if str(numbers[k4][1]) == self.words[self.j] :
self.flag='nu'
break
self.j=self.j+1
for k5 in stop:
self.j=0
while self.j < len(self.words):
if stop[k5][1] == self.words[self.j] :
print 'in if set flag'
self.flag='s'
break
self.j=self.j+1
if self.flag =='d':
if len(self.words) == 1:
self.list_var.append(direction.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(direction.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 'v':
if len(self.words) == 1:
self.list_var.append(verbs.get(self.words[0]))
return self.list_var
else :
print "else"
self.i = 0
while self.i < len(self.words):
self.list_var.append(verbs.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 'n':
if len(self.words) == 1:
self.list_var.append(nouns.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(nouns.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 'nu':
if len(self.words) == 1:
self.list_var.append(numbers.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(numbers.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
elif self.flag == 's':
if len(self.words) == 1:
self.list_var.append(stop.get(self.words[0]))
return self.list_var
else :
self.i = 0
while self.i < len(self.words):
self.list_var.append(stop.get(self.words[self.i]))
self.i=self.i+1;
return self.list_var
from nose.tools import *
from ex48.lexicon import lexicon
lex=lexicon()
def test_directions():
print lex.scan("north")
assert_equal(lex.scan("north"), [('direction', 'north')])
result = lex.scan("north south east")
assert_equal(result, [('direction', 'north'),
('direction', 'south'),
('direction', 'east')])
def test_verbs():
assert_equal(lex.scan("go"), [('verb', 'go')])
result = lex.scan("go kill eat")
assert_equal(result, [('verb', 'go'),
('verb', 'kill'),
('verb', 'eat')])
def test_nouns():
assert_equal(lex.scan("bear"), [('noun', 'bear')])
result = lex.scan("bear princess")
assert_equal(result, [('noun', 'bear'),
('noun', 'princess')])
def test_numbers():
assert_equal(lex.scan("1234"), [('number', 1234)])
result = lex.scan("3 91234")
assert_equal(result, [('number', 3),
('number', 91234)])
def test_stops():
assert_equal(lex.scan("the"), [('stop', 'the')])
result = lex.scan("the in of")
assert_equal(result, [('stop', 'the'),
('stop', 'in'),
('stop', 'of')])
'''def test_errors():
assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])
result = lexicon.scan("bear IAS princess")
assert_equal(result, [('noun', 'bear'),
('error', 'IAS'),
('noun', 'princess')])'''
对于test\u errors()函数也可以执行类似的实现。我的完整代码
lexicon.py
directions = ("north", "south", "east", "west", "down", "up", "left", "right", "back")
verbs = ("go", "stop", "kill", "eat")
stops = ("the", "in", "of", "from", "at", "it")
nouns = ("door", "bear", "princess", "cabinet")
def select(raw_word):
word = raw_word.lower()
if word in directions:
return ("direction", raw_word)
elif word in verbs:
return ("verb", raw_word)
elif word in stops:
return ("stop", raw_word)
elif word in nouns:
return ("noun", raw_word)
else:
try:
return ("number", int(raw_word))
except ValueError:
return ("error", raw_word)
def scan(words):
word_list = str(words).split()
return map(select, word_list)
总共24行。太棒了,谢谢!快速提问,因为我对这方面还是新手。这会返回作为元组提供给它的句子吗?有人提到这是该职能的目的。书中写道:“这个扫描器将从用户那里获取一个原始输入字符串,并返回一个由元组列表和(标记,单词)对组成的句子。如果单词不在词典中,那么它仍然应该返回单词,但将标记设置为错误标记。这些错误标记将告诉用户他们搞错了。”,打印它,你会看到它返回什么-一个元组列表。哦,对了。现在它给我带来了各种各样的麻烦。似乎测试程序无法导入代码。我不断收到错误消息,如:ImportError:无法导入名称词典或没有名为词典或名称的模块错误:全局名称“词典”不可用defined@Adam如果这个答案对你有帮助,就把它投进去,并考虑接受它吧!
directions = ("north", "south", "east", "west", "down", "up", "left", "right", "back")
verbs = ("go", "stop", "kill", "eat")
stops = ("the", "in", "of", "from", "at", "it")
nouns = ("door", "bear", "princess", "cabinet")
def select(raw_word):
word = raw_word.lower()
if word in directions:
return ("direction", raw_word)
elif word in verbs:
return ("verb", raw_word)
elif word in stops:
return ("stop", raw_word)
elif word in nouns:
return ("noun", raw_word)
else:
try:
return ("number", int(raw_word))
except ValueError:
return ("error", raw_word)
def scan(words):
word_list = str(words).split()
return map(select, word_list)