Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对复合语句的求值,如同条件_Python - Fatal编程技术网

Python对复合语句的求值,如同条件

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

我很难理解if语句条件下语句的求值顺序:

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

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)
。很明显他不想要重复项。但是,顺序可能仍然很重要(在这种情况下,
设置不合适)正确的顺序可能很重要,但他没有这样说,如果是这样,他也没有具体说明要保存的顺序是第一次看到还是最后一次看到。不过,在这一点上,我们谈论的几乎是纯猜测,没有具体说明。:)正确。正如我在最初的评论中所说,如果没有其他约束导致集合无法使用,这是一个很好的建议。我甚至投了更高的票,因为我非常喜欢:^)。