在Python中,将元素添加到嵌套列表中的列表。

5

我正在开发一个程序add_to_index,它有三个输入:

  • 索引:[[,[url1,url2,...]],...]
  • 关键字:字符串
  • URL:字符串

如果关键字已经存在于索引中,则将URL添加到与该关键字相关联的URL列表中。

如果关键字不在索引中,则向索引添加一个新元素:

[keyword,[url]]

代码

index = []

def add_to_index(index,keyword,url):
    flag = 0
    count = 0
    for lists in index:
        count += 1
        if(lists[0]==keyword): 
            index[count][1].append(url)

    if(flag ==0):
        index.append([keyword,url])   

#calling the function below

add_to_index(index,'google','http://google.com')
print index

输出 -> [['谷歌', 'http://google.com']]

add_to_index(index,'computing','http://acm.org')
print index

输出 -> [['谷歌', 'http://google.com'], ['计算机', 'http://acm.org']]

add_to_index(index,'google','http://gmail.com') 
print index

错误->

index[count][1].append(url)
AttributeError: 'str' object has no attribute 'append'

预期输出:

 [['google', ['http://google.com', 'http://gmail.com']], 
 ['computing', ['http://acm.org']]]

1
这真的看起来不是适合这种情况的数据结构:你最好使用一个字典和一个字典构建器。 - ekrah
1
这句话来自我在一场竞技编程比赛中参加的一道小测验。 - akshaynagpal
5个回答

3

你犯了三个错误。首先,你没有使用flag;其次,你将url作为字符串添加;最后,正如评论中的Kaivosuketaja所提到的,计数应该在结束时增加。可以通过其他方式完成。

index = []

def add_to_index(index,keyword,url):
    flag = 0
    count = 0

    for lists in index:

        if(lists[0]==keyword): 
            flag = 1
            index[count][1].append(url)
        count += 1

    if(flag ==0):
        index.append([keyword,[url]])   
        # Take note of append away here
#calling the function below

add_to_index(index,'google','http://google.com')
print index

add_to_index(index,'computing','http://acm.org')
print index

add_to_index(index,'google','http://gmail.com') 
print index

现在的输出结果是

[['google', ['http://google.com']]]
[['google', ['http://google.com']], ['computing', ['http://acm.org']]]
[['google', ['http://google.com', 'http://gmail.com']], ['computing', ['http://acm.org']]]

1
把那三个错误改过来 - count 应该在 for 循环结束时增加。 - Kaivosukeltaja
2
@Kaivosukeltaja 对不起,如果你感到不舒服,但是由于某些原因,我花了三分钟来写你的名字,无法复制和粘贴。:( .. - Bhargav Rao

0
首先,你正在尝试追加到列表中要追加的字符串。然后,在找到关键字时,你忘记说标志=1。请尝试以下方法:
index = []

def add_to_index(index,keyword,url):
    flag = 0
    count = 0
    for lists in index:
        if(lists[0]==keyword): 
            index[count][1].append(url)
            flag = 1
    count += 1
    if(flag ==0):
        index.append([keyword,url])   

#calling the function below

add_to_index(index,'google','http://google.com')
add_to_index(index,'computing','http://acm.org')
add_to_index(index,'google','http://gmail.com') 
print index

我认为你最好使用defaultdict,它会自动搜索关键字并将项目添加到现有的关键字中,或者如果未找到关键字,则创建一个新的关键字。


0

我认为这就是你想要的:

index = []

def add_to_index(index,keyword,url):
    flag = 0
    count = 0
    for lists in index:        
        if lists[0] == keyword: 
            lists[1].append(url)
            flag = 1
        count += 1

    if flag == 0:
        index.append([keyword, [url]])   

#calling the function below

add_to_index(index,'google','http://google.com')
print index

0
我建议使用字典来完成这个任务:
index = {}

def add_to_index(index, keyword, url):
    if keyword not in index:
        index[keyword] = [url]
    else:
        index[keyword].append(url)


>>> add_to_index(index,'computing','http://acm.org')
>>> add_to_index(index,'google','http://gmail.com') 
>>> add_to_index(index,'google','http://gmail.com') 
>>> index
{'computing': ['http://acm.org'], 'google': ['http://gmail.com', 'http://gmail.com']}

你甚至可以通过实现一个简单的类(当然,嵌套列表也可以)将index变成非全局变量:

class Index(object):

    def __init__(self):
        self.index = {}

    def add_to_index(self, keyword, url):
        if keyword not in index:
            self.index[keyword] = [url]
        else:
            self.index[keyword].append(url)

0
你可以通过消除标志和计数变量来简化事情。
index = []

def add_to_index(index, keyword, url):
    for e in index:
        if e[0] == keyword:
            e[1].append(url)
            return

        else:
            index.append([keyword,[url]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接