了解Python中的in运算符

时间:2018-12-14 05:34:41

标签: python

index = []

def add_to_index(index,keyword,url):
    if len(index) == 0:
        index.append([keyword, [url]])
    elif keyword in index:
        find_key_pos = index.find(keyword)
        index.insert(find_key_pos + len(keyword), url)

add_to_index(index,'udacity','http://udacity.com')
add_to_index(index,'udacity','http://npr.org')
print(index)

我的输出是:

[['udacity', ['http://udacity.com']]]

实际上输出必须是

[['udacity', ['http://udacity.com', 'http://npr.org']]

每当索引列表中已经存在关键字时,我只需将URL插入到关键字旁边的列表中即可。 在,

add_to_index(index,'udacity','http://udacity.com')
add_to_index(index,'udacity','http://npr.org')

关键字“ udacity”是相同的,这就是为什么我应该在该关键字之后添加不同的url。

1 个答案:

答案 0 :(得分:1)

您的错误:

index.insert(find_key_pos + len(keyword), url)

list.insert()的第一个参数是新元素的索引。实际上,您实际上只想获取关键字列表,然后将新的URL附加到嵌套列表中。

您想要的是:

index[find_key_pos].append(url)

第二个错误在于重复使用index变量。您的功能参数正在从父作用域隐藏列表。使用不同的名称。您的代码将起作用,因为列表是可变的,并且您传递了对同一列表的引用,但这会在以后造成很多混乱。


但是您真正应该做的是您应该查找Python字典。他们提供了开箱即用的关键字功能。

这是一个小的dict包装器,可以使您的生活更轻松:

class ListDict():
    def __init__(self):
        self.index = ()

    def addEntry(self, key, entry):
        if key in self.index:
            self.index[key].append(entry)
        else:
            self.index[key] = [entry]

    def getEntries(self, key):
        if key in self.index:
            return self.index[key]
        else:
            return []

用法:

websiteUrls = ListDict()
websiteUrls.addEntry("udemy", "foo")
websiteUrls.addEntry("udemy", "bar")
websiteUrls.getEntries("udemy")
# ["foo", "bar"]
websiteUrls.getEntries("nope")
# []