我正在参加Udacity的“计算机科学入门”课程,我被要求在测验中解决这个问题:
定义一个过程add_to_index, 这需要3个输入:
如果关键字已经存在 在索引中,添加url 到相关的网址列表 用那个关键字。
如果关键字不在索引中, 在索引中添加一个条目:[keyword,[url]]
此测验的目的是创建一个名为index的列表,该列表由包含关键字及其关联网址的列表组成 索引列表如下所示: [[关键字1,[URL1,URL2,URL3]],[1关键字,[URL1,URL2]],...]
我应该写这个函数。这是我的回答,被法官接受了。
index = []
def add_to_index(index,keyword,url):
p=[]
q=[]
if index==[]:
q.append(url)
p.append(keyword)
p.append(q)
index.append(p)
else:
for e in index:
if e[0]==keyword:
e[1].append(url)
return index
index.append([keyword,[url]])
return index
法官认为这个答案是成功的。 现在奇怪的部分开始了(对我来说:p)。这是课程中给出的代码
index=[]
def add_to_index(index,keyword,url):
for e in index:
if e[0]==keyword:
e[1].append(url)
return
index.append([keyword,[url]])
add_to_index(index,'udacity','http://udacity.com') #Test Case
add_to_index(index,'computing','http://acm.org') #Test Case
add_to_index(index,'udacity','http://npr.org') #Test Case
print index
如您所见,此代码的核心与我的代码类似。它们都提供相同的输出。这是两个代码给出的输出。
[['udacity', ['htxtp://udacity.com', 'htxtp://npr.org']], ['computing', ['htxtp://acm.org']]]
(我在http单词的中间添加了x,因为我没有足够的声誉来包含链接。输出实际上不包含http单词中间的x字母)
所以这些是我的问题:
在课程给出的代码中,return关键字后面没有任何内容。那么函数如何知道返回什么?此外,如果索引列表中尚不存在关键字,则在执行条件执行时,将退出for循环而不包含代码。因此程序永远不会执行return语句。那么函数如何返回索引列表?
在课程给出的代码中,没有安排作为参数传递的空索引列表,而在我的代码中,有。处理我的代码中的空索引列表的代码只使用一次(当第一次调用该函数时),但是,它很重要(或者这就是我的想法)。那么课程提供的代码怎么能在不包括这种安排的情况下逃脱呢?为什么第一次调用函数时它不会崩溃?如何访问空索引列表列表的e [0]和e [1]元素?
感谢您回答这个超长问题:)。
答案 0 :(得分:0)
它不会返回任何内容。它修改了已传入的列表index
。
课程代码从不索引空列表的元素0和1。它遍历列表index
,index
中的每个项本身就是一个列表(子列表)。这保证至少有两个元素,因为当添加每个子列表时,它添加了两个元素(第二个元素是列表本身:子子列表)。如果index
本身为空,则for
循环不执行任何操作:对每个元素执行一次,如果有0个元素,则执行0次。
答案 1 :(得分:0)
列表是可变的。网址列表已就地修改。无需退货。
代码遍历索引的每个元素。如果没有这些,则for
循环不会运行,并且关键字将附加到索引。
反之亦然,正如您所看到的,当找到关键字时,代码会附加网址并返回。
注意:在我看来代码存在缺陷,因为它可以为同一个关键字添加重复的网址。
另一种更加pythonic的方法是
def add_to_index(index,keyword,url):
kg = (el[1] for el in index if el[0] == keyword)
try:
ul = next(kg)
except StopIteration:
index.append([keyword,[url]])
else:
if url not in ul:
ul.append(url)
所以用
调用它index = []
add_to_index(index,'udacity','http://udacity.com') #Test Case
add_to_index(index,'computing','http://acm.org') #Test Case
add_to_index(index,'udacity','http://npr.org') #Test Case
add_to_index(index,'udacity','http://udacity.com') # 1st test case again
print index
产生
[['udacity', ['http://udacity.com', 'http://npr.org']], ['computing', ['http://acm.org']]]