我无法理解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
任何帮助澄清这一点都将不胜感激。
答案 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)
如果您按照另一个答案中的建议使用defaultdict
,defaultdict
将为您执行此检查(第一个if
- 声明)。
更新:我自己弄错了复合if条件......第一段现已修复。