【问题标题】:Return the index of a list of a fuzzywuzzy match返回一个模糊匹配列表的索引
【发布时间】:2017-06-23 19:32:09
【问题描述】:

我有一个“id”列表:

ids = [None, '20160928a', '20160929a', ... ]

我发现的另一个“ids”列表是使用fuzzywuzzy的重复ids:

repeat_offenders = ['20160928a', '20161115a', '20161121a', ... ]

我想再次使用fuzzywuzzy 创建一个列表列表,其中包含重复ID 在列表“ID”中的位置(按索引)。所以输出看起来像这样(因为它们是重复的,所以列表中的每个列表都至少包含两个元素:

collected_ids = [[0,5,700], [6,3], [4,826,12]]

我的尝试,目前只返回id而不是id的位置:

collected_urls = []
for offender in repeat_offenders[:10]:
     best_match = process.extract(offender, ids)
     collection = []
     for match in best_match:
         if match[1] > 95:
            collection.append(match[0])
         else:
            pass
     collected_urls.append(collection)

更新,我尝试使用 Moe 的答案来查找/分组完全匹配:

idz = ids
collected_ids = []
for i in range(len(idz)):
    tmp = [i]
    for j in range(len(ids)):
        if idz[i] == idz[j] and i != j:
            tmp.append(j)
            del j 
    if len(tmp) > 1:
        collected_ids.append(tmp)
    del i

【问题讨论】:

  • 您使用fuzzywuzzy 查找重复项的任何原因,如果字符串匹配,您不能简单地测试是否相等?
  • 因为我想对相似的 id 进行分组,因为“重复”可能不完全(100%)相同,这就是我使用 95 阈值的原因......但是相当多的重复正是相同-因此使用相等可能是最简单(并且足够好)的选择..您介意告诉我如何根据相等来要求我吗?谢谢!

标签: python regex list fuzzywuzzy


【解决方案1】:

如果不是必须使用fuzzywuzzy,您可以使用两个for-loops 来检查重复项并生成list,如下所示:

collected_ids = []
for i in xrange(len(ids)):
    tmp = [i]
    for j in xrange(len(ids)):
        if ids[i] == ids[j] and i != j:
            tmp.append(j)
    if len(tmp) > 1:
        collected_ids.append(tmp)
collected_ids = list(set(collected_ids))

编辑:

如果你想避免重复,你可以创建一个列表来检查索引是否已经添加,如下所示:

collected_ids = []
ids = ['a', 'b', 'a', 'c', 'd', 'a', 't', 't', 'k', 'c']
check = [] 
for i in range(len(ids)):
    tmp = [i]
    check.append(i)  
    for j in range(len(ids)):
        if ids[i] == ids[j] and i != j and j not in check:
            tmp.append(j)
            check.append(j)
    if len(tmp) > 1:
        collected_ids.append(tmp)
print(collected_ids)

输出:

[[0, 2, 5], [3, 9], [6, 7]]

【讨论】:

  • 谢谢,但这不起作用... xrange() 未在 python3 中定义(这是我正在使用的)。另一件事是,一旦“i”找到它,它就会匹配它,并且应该从列表“ids”中删除它的匹配项,因为否则它将创建一个迭代过程并在collected_ids中包含一个重复的列表......我尝试解决这些问题并通过我的尝试“更新”了我的问题:)
  • @GrahamStreich 我已经更新了答案以避免重复,请查看并告诉我 =)
  • 很高兴知道 :) 如果它解决了您的问题,请不要忘记接受答案!
  • 谢谢,我会接受这个答案,除非你的答案只是对使用模糊伍兹的实际问题提供了一个启发式的方法;p 我非常感谢你的时间和回答的想法:)
  • @GrahamStreich 如果您使用的是 python3,请使用 range 而不是 xrange
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2016-10-14
  • 2023-03-07
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多