将元素追加到嵌套列表中的列表 - python

时间:2014-12-15 20:04:02

标签: python list nested-lists

我正在开发一个过程add_to_index,它需要3个输入:

  • 索引:[[,[url1,url2,...]],...]
  • 关键字:字符串
  • 一个网址:字符串

如果关键字已在索引中,则会将url添加到与该关键字相关联的网址列表中。

如果关键字不在索引中,则新元素将出现在索引中:

[keyword,[url]]

CODE

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

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

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

输出 - > [['google', 'http://google.com'], ['computing', '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']]]

5 个答案:

答案 0 :(得分: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 :(得分:0)

首先,您尝试追加要添加到列表中的字符串。然后,当您找到关键字时,忘记说flag = 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会好得多。它会自动搜索关键字并将项目添加到现有关键字,如果找不到,则会创建新关键字。

答案 2 :(得分: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

答案 3 :(得分: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)

答案 4 :(得分:0)

你可以通过删除标志和计数变量来简化一些事情。

$word = "coffee shop";
$response = Article::whereRaw(array('$text'=>array('$search'=> "\"" . $word . "\"")))->get();