Python复合语句的评估就像条件一样

时间:2012-09-12 19:29:08

标签: python

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

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

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

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

1)索引中不存在密钥(WORD),需要创建一个列表并将WORD设置为
键入地图

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

任何帮助澄清这一点都将不胜感激。

3 个答案:

答案 0 :(得分:3)

他们肯定不同(因为你有else条款)。在第一种情况下,如果您的字典中包含密钥,则输入else子句,并且该元素已在列表中(您可能不想要)。

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

答案 1 :(得分:2)

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

from collections import defaultdict

url_store = defaultdict(set)
url_store[word].add(url)

答案 2 :(得分:1)

问题是,只要找到列表中已有的网址,就会覆盖整个网址列表。

您的条件会检查单词是否在索引中是否该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)

如果您按照另一个答案中的建议使用defaultdictdefaultdict将为您执行此检查(第一个if - 声明)。

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