比较python字典值

时间:2015-12-01 21:31:19

标签: python dictionary

我正在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和2 + 3等值的值?我想比较它们,看看单词的位置是否只是另一个单词的+1。

所以你可以看到doc 6 word 2跟在单词1之后,这会导致密钥被发回。

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现您在此尝试做的事情。我假设根据你给我的例子,总是只有两个单词,并且列表总是按顺序排列。

无论采用何种方法,您都需要遍历文档(字典)。在Python中迭代字典很简单;你可以看到一个例子here。之后,步骤改变

第一个选项 - 效率更低,更简单:

  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
    
  4. 第二个选项 - 效率更高,更复杂一点:

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

      示例:

      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
      
    4. 提醒一下,如果列表始终已排序,则选项2 有效。此外,您并不总是需要立即返回文档ID。如果您希望发生对的所有文档而不是它找到的第一个文档,您可以将文档ID添加到列表中。您甚至可以使用字典轻松跟踪单词对在每个文档中出现的次数。

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