这个python代码中发生了什么?

时间:2015-10-31 06:32:24

标签: python list data-structures

我正在参加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字母)

所以这些是我的问题:

  1. 在课程给出的代码中,return关键字后面没有任何内容。那么函数如何知道返回什么?此外,如果索引列表中尚不存在关键字,则在执行条件执行时,将退出for循环而不包含代码。因此程序永远不会执行return语句。那么函数如何返回索引列表?

  2. 在课程给出的代码中,没有安排作为参数传递的空索引列表,而在我的代码中,有。处理我的代码中的空索引列表的代码只使用一次(当第一次调用该函数时),但是,它很重要(或者这就是我的想法)。那么课程提供的代码怎么能在不包括这种安排的情况下逃脱呢?为什么第一次调用函数时它不会崩溃?如何访问空索引列表列表的e [0]和e [1]元素?

  3. 感谢您回答这个超长问题:)。

2 个答案:

答案 0 :(得分:0)

  1. 它不会返回任何内容。它修改了已传入的列表index

  2. 课程代码从不索引空列表的元素0和1。它遍历列表indexindex中的每个项本身就是一个列表(子列表)。这保证至少有两个元素,因为当添加每个子列表时,它添加了两个元素(第二个元素是列表本身:子子列表)。如果index本身为空,则for循环不执行任何操作:对每个元素执行一次,如果有0个元素,则执行0次。

答案 1 :(得分:0)

  1. 列表是可变的。网址列表已就地修改。无需退货。

  2. 代码遍历索引的每个元素。如果没有这些,则for循环不会运行,并且关键字将附加到索引。 反之亦然,正如您所看到的,当找到关键字时,代码会附加网址并返回。

  3. 注意:在我看来代码存在缺陷,因为它可以为同一个关键字添加重复的网址。

    另一种更加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']]]