匹配列表中的结果

时间:2015-12-03 17:28:16

标签: python list

我有一个包含以下结构的列表;

[('0','927','928'),('2','693','694'),('2','742','743'),('2','776','777'),('2','804','805'),
('2','987','988'),('2','997','998'),('2','1019','1020'),
('2','1038','1039'),('2','1047','1048'),('2','1083','1084'),('2','659','660'),
('2','677','678'),('2','743','744'),('2','777','778'),('2','805','806'),('2','830','831')

第一个数字是一个id,第二个数字是一个单词的位置,第三个数字是第二个单词的位置。我需要做的就是努力寻找彼此相邻的词汇。

这些结果是针对3个单词的搜索而给出的,因此单词1的位置为单词2,单词2的位置为单词3.例如;

我运行短语查询"women in science"然后我获取上面列表中给出的值,因此('2','776','777')'women in'的结果,('2','777','778')'in science'的结果{1}}。

我需要找到一种方法来匹配这些结果,因此对于每个文档,它根据查询中的单词数量将单词组合在一起。 (因此,如果查询中有4个单词,则需要将3个结果匹配在一起)。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您需要根据其位置快速查找字词信息。创建一个由单词位置键入的字典:

# from your example; I wonder why you use strings and not numbers.
positions = [('0','927','928'),('2','693','694'),('2','742','743'),('2','776','777'),('2','804','805'),
('2','987','988'),('2','997','998'),('2','1019','1020'),
('2','1038','1039'),('2','1047','1048'),('2','1083','1084'),('2','659','660'),
('2','677','678'),('2','743','744'),('2','777','778'),('2','805','806'),('2','830','831')]

# create the dictionary
dict_by_position = {w_pos:(w_id, w_next) for (w_id, w_pos, w_next) in positions}

现在跟随连锁店是一块蛋糕:

>>> dict_by_position['776']
('2', '777')
>>> dict_by_position['777']
('2', '778')

或以编程方式:

def followChain(start, position_dict):
  result = []
  scanner = start
  while scanner in position_dict:
    next_item = position_dict[scanner]
    result.append(next_item)
    unused_id, scanner = next_item  # unpack the (id, next_position)
  return result

>>> followChain('776', dict_by_position)
[('2', '777'), ('2', '778')]

找到彼此不是子链的所有链:

seen_items = set()
for start in dict_by_position:
  if start not in seen_items:
    chain = followChain(start, dict_by_position)
    seen_items.update(set(chain))  # mark all pieces of chain as seen
    print chain  # or do something reasonable instead

答案 1 :(得分:1)

以下将按照我的理解做你所要求的 - 它不是世界上最漂亮的输出,而且我认为如果可能的话你应该使用数字,如果数字就是你&# 39;重新努力。 可能有更优雅的解决方案,并且可以对此进行简化:

list.size() == 1

上面的输出是:

{' 0':[' 927',' 928'],' 2':[[' 1019&# 39;,' 1020'],[' 1038',' 1039'],[' 1047',' 1048&#39 ;],[' 1083',' 1084'],[''' 660'],[' 677&# 39;,' 678'],[' 693',' 694'],[' 742',' 743&#39 ;,' 744'],[' 776',' 777',' 778'],[' 804' ,' 805',' 806'],[' 830',' 831'],[' 987', ' 988']]}