-1

我无法理解 if 语句条件的语句的评估顺序:

假设我有一本这样的字典,它将单词映射到网页列表:

index = { WORD, [url1,url2,url3] }

插入此索引时有两种情况:

1)索引中已经不存在键(WORD),需要创建一个列表,并将WORD设置为
map中的键

2)键(WORD)已经存在于索引中,我只需要将当前url附加到字典中已经存在的列表中

我期望的工作:

def update_index(word, url):
    if word in index and not(url in index[word]):
       index[word].append(url) # list already exists append to it
    else: 
       index[word] = [url] # new list with url as a single element

然而,这仅允许每个单词 1 个 url。

什么工作:

def update_index(word, url):
    if word in index:                  # <- isnt having two consecutive if statements 
                                       # the same as an AND???
       if not(url in index[word]):
          index[word].append(url) # list already exists append to it
    else: 
       index[word] = [url] # new list with url as a single element

任何帮助解决这个问题将不胜感激。

4

3 回答 3

3

它们肯定是不同的(因为你有一个else子句)。在第一种情况下,如果else您的字典具有键,并且该元素已经在列表中(您可能不想要),则您输入子句。

换句话说,当url已经在列表中时,您将列表替换为,[url]而不是什么都不做。

于 2012-09-12T19:38:30.020 回答
2

要了解逻辑问题,请查看其他答案。但正如我在评论中所说,您可以通过以下方式解决整个问题:

from collections import defaultdict

url_store = defaultdict(set)
url_store[word].add(url)
于 2012-09-12T19:43:27.097 回答
1

问题是,每当您找到一个已经在列表中的 URL 时,您总是会覆盖整个 URL 列表。

您的条件检查该词是否在索引中以及URL 是否尚未在该词的列表中。因此,如果单词在索引中,并且 URL 已经在列表中,则整个条件评估为 false 并执行 else-case,用仅包含重复 URL 的列表覆盖该单词的现有列表。

相反,你应该试试这个:

if word not in index:
    index[word] = [] # create new empty list for word
# now we know that a list exists -> append
if url not in index[word]:
    index[word].append(url)

如果您defaultdict按照另一个答案中的建议使用 a ,defaultdict则会为您执行此检查(第一个if语句)。

更新:我自己弄错了复合 if 条件...第一段现已修复。

于 2012-09-12T19:39:42.960 回答