Python对复合语句的求值,如同条件
我很难理解if语句条件下语句的求值顺序: 假设我有一本这样的字典,可以将单词映射到网页列表:Python对复合语句的求值,如同条件,python,Python,我很难理解if语句条件下语句的求值顺序: 假设我有一本这样的字典,可以将单词映射到网页列表: index = { WORD, [url1,url2,url3] } 插入此索引时,有两种情况: 1) 索引中已不存在关键字(WORD),您需要创建一个列表并将WORD设置为 在地图上键入 2) 索引中已经存在关键字(单词),我只需要将当前url附加到字典中已经存在的列表中 我期望的工作是: def update_index(word, url): if word in index and n
index = { WORD, [url1,url2,url3] }
插入此索引时,有两种情况:
1) 索引中已不存在关键字(WORD),您需要创建一个列表并将WORD设置为在地图上键入 2) 索引中已经存在关键字(单词),我只需要将当前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
然而,这只允许每个单词有一个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
def更新索引(word、url):
如果索引中的单词:#它们绝对不同(因为您有一个else
子句)。在第一种情况下,如果您的字典有键,并且元素已经在列表中(您可能不想要),则输入else
子句
换句话说,当url
已经在列表中时,您可以将列表替换为[url]
,而不是什么都不做。问题是,每当您找到已在列表中的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
,则defaultdict
将为您执行此检查(第一个If
-语句)
更新:如果条件不对,我自己得到了合成。。。第一段现在已固定。要理解逻辑问题,请查看其他答案。但正如我在评论中所说,您可以通过以下方式结束整个问题:
from collections import defaultdict
url_store = defaultdict(set)
url_store[word].add(url)
请展示示例输入/数据结构布局和输出。尝试将defaultdict
与set
一起使用,而不是将常规dict
与列表一起使用
@Marcin这是我要询问的应用程序的相关部分。完整的应用程序太大,无法在此处合理发布。@HunterMcMillen如果你不想让人们知道出了什么问题,那就直接忽略我的建议。@HunterMcMillen:Marcin不是要整个应用程序,他是要一小段代码样本,有人可以复制并粘贴到解释器中进行测试。我不得不自己写一个测试用例来检查我的解决方案(但mgilson ninja欺骗了我,让他见鬼去了)。唷——我差点错过了这个。有时候,这些小的逻辑问题可能会很棘手……谢谢,完全忽略了这一点。@HunterMcMillen——我坐在那里眨了眨眼睛想了一会儿,“代码中的其他地方一定有问题……”这是一个很好的建议(但前提是集合是url所在的适当容器,这主要取决于问题的其余部分)。列表上的唯一性约束使得defaultdict(list)
的价值大大降低。是的,我选择set
是因为not(url in index[word])
子句。如果他想跟踪重复项,则应该是defaultdict(list)
和url\u store[word].append(url)
。很明显他不想要重复项。但是,顺序可能仍然很重要(在这种情况下,设置不合适)正确的顺序可能很重要,但他没有这样说,如果是这样,他也没有具体说明要保存的顺序是第一次看到还是最后一次看到。不过,在这一点上,我们谈论的几乎是纯猜测,没有具体说明。:)正确。正如我在最初的评论中所说,如果没有其他约束导致集合无法使用,这是一个很好的建议。我甚至投了更高的票,因为我非常喜欢:^)。