繁体   English   中英

比较python字典值

[英]comparing python dictionary values

我正在用python创建一个非常基本的搜索引擎,正在努力创建一种用于处理词组查询的方法,因此,如果2个单词的位置在1之内,它们在文档中彼此相邻,它将输出所有文档编号这发生的地方。

我目前有一本字典,看起来像这样

{'8':[['1170', '1264', '1307', '1559', '1638'], ['197', '1169']], 
 '6':[['345', '772'], ['346']}

这只是一个布局示例。

w=word, p=position ||
{doc1:[w1p1, w1p2, w1p3],[w2p1, w2p2]}

关键是文档ID,后跟第一个单词在该文档中的位置,然后是第二个单词的位置。 将有与查询中一样多的单词(位置分组)。

我的问题是,有没有一种方法可以比较同一文档ID的1和2nd + 3rd等值? 我想对它们进行比较,以查看单词位置是否仅为另一个单词的+1。

因此,对于doc 6,您可以看到单词1后面紧跟着单词2,这将导致密钥被发回。

有几种方法可以实现您要在此处完成的任务。 我假设根据您给我的示例,总是只有两个单词,并且列表始终是有序的。

无论使用哪种方法,都需要遍历文档(字典)。 在Python中遍历字典很简单; 你可以在这里看到一个例子。 之后,步骤会更改

首选-效率较低,稍微简单一些:

  1. 遍历列表1(第一个单词的位置)中的每个项目(位置)。
  2. 遍历列表2中的每个项目(位置)(第二个单词的位置)。
  3. 比较两个位置,如果它们在彼此的1个范围内,则返回文档ID。

    例:

     for documentNumber in docdictionary: for word1location in docdictionary[documentNumber][0]: for word2location in docdictionary[documentNumber][1]: if abs(word1location - word2location) == 1: return documentNumber 

第二种选择-效率更高,稍微复杂一些:

  1. 从每个单词位置列表的开头开始,跟踪您的位置
  2. 在您所在的位置检查两个值。
    • 如果两个值相隔1个字,请返回文件编号
    • 如果两个值都不相同,请检查哪个列表项(页面位置)的值较低,然后移至该列表的下一个项目,重复
  3. 如果其中一个列表(例如列表1)用完了数字,而另一个列表(列表2)的值大于第一个列表(列表1)的最后一个值,则返回None。

    例:

     for documentNumber in docdictionary: list1pos = 0 list2pos = 0 while True: difference = docdictionary[documentNumber][0][list1pos] - docdictionary[documentNumber][1][list2pos] if abs(difference) == 1: return documentNumber if difference < 0: #Page location 2 is greater list1pos++ if list1pos == len(docdictionary[documentNumber][0]): #We were at the end of list 1, there will be no more matches break else: #Page location 1 is greater list2pos++ if list2pos == len(docdictionary[documentNumber][1]): #We were at the end of list 2, there will be no more matches break return None 

提醒一下,选项2 在列表始终排序时才起作用。 另外,您不必总是立即返回文档ID。 如果您希望该对发生的所有文档而不是查找的第一个文档,则可以将文档ID添加到列表中。 您甚至可以使用词典轻松跟踪单词对在每个文档中出现的次数。

希望这对您有所帮助! 如果有任何不清楚的地方,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM