比较多个Python列表并合并Levenshtein相似性

2024-10-08 19:30:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个Python函数,它接受两个列表,使用Levenshtein对它们进行比较,并将足够相似的单词合并到一个名为'merged'的列表中。在

如何对6+列表执行此操作?确保每个列表与其他5个列表进行比较,依此类推?在

first_list = ["Mouse", "Cat", "Dog", "Gremlinge", "Horse"]
second_list = ["Mouse", "Cat", "Hors", "Dog", "Gremling"]
third_list = ["Mouse", "Cat", "Horrs", "Dog", "Greemling"]
fourth_list = ["Mouse", "Cate", "Dog", "Gremlinge", "Horse"]
fifth_list = ["Mose", "Cat", "Hors", "Dog", "Gremling"]
sixth_list = ["Mouse", "Cat", "Horser", "Doeg", "Gremling"]

def lev_merging(a, b): # function to compare 2 lists
  merged = [] # Empty list to add the matching words
  for first in a:
    for second in b:
      if levenshtein(first, second) < 2:
        merged.append(set([first,second]))
  return merged

print (lev_merging(first_list,second_list))

Working www.repl.it fiddle of code.


Tags: to列表mergedlistcatfirstseconddog
2条回答

这个答案有两个答案。对于两者,您需要创建一个包含所有要比较的列表的列表。在

例如,使用上述案例,您可以执行以下操作:

lists = [first_list, second_list]

ITERTOOLS解决方案

在这个解决方案中,您使用itertools.combinations方法,该方法遍历所有可能的组合,这意味着它将每个列表与其他列表进行比较。你可以这样实现它:

^{pr2}$

{iterable是第二个方法中的两个元素的组合。在这种情况下2。例如:

itertools.combinations('ABCD', 2)

退货:

('A', 'B')
('A', 'C')
('A', 'D')
('B', 'C')
('B', 'D')
('C', 'D')

以及:

itertools.combinations('ABCD', 3)

退货:

('A', 'B', 'C')
('A', 'B', 'D')
('A', 'C', 'D')
('B', 'C', 'D')

循环解决方案

如果你不想导入一些奇怪的模块,不用担心。您可以始终使用这个只需要2个for循环的解决方案。在

for i in range(len(lists)):
    for j in range(i + 1, len(lists)):
        for first in lists[i]:
            for second in lists[j]:
                if levenshtein(first, second) < 2:
                    merged.append(set([first,second]))

通过这样做,您可以成功地将每个列表中的每个项目与其他列表中的每个项目进行比较,而不必对两个列表进行两次比较。在

我们会有一个字符串列表

list_of_lists = [["Mouse", "Cat", "Dog", "Gremlinge", "Horse"],
                  ["Mouse", "Cat", "Hors", "Dog", "Gremling"],
                  ["Mouse", "Cat", "Horrs", "Dog", "Greemling"],
                  ["Mouse", "Cate", "Dog", "Gremlinge", "Horse"],
                  ["Mose", "Cat", "Hors", "Dog", "Gremling"],
                  ["Mouse", "Cat", "Horser", "Doeg", "Gremling"]]

然后我们将遍历这个列表,跟踪我们“所在”的列表的索引,并将这个列表与它后面的所有列表进行比较。在

^{pr2}$

编辑:下面的代码将成对的列表传递到一个函数中,并将它们分成组。然后我们将把这些组中的每一组处理成集合,以消除重复项。在

target_num_words = 6
target_num_words

def merging(list_of_lists):
    groups = []
    for i, a in enumerate(list_of_lists):
        for b in list_of_lists[i+1:]:
            if number_of_matches(a, b) >= target_num_words:
                for g in groups:
                    if a in g or b in g:
                        g.append(a if b in g else b)
                        break
                else:
                    groups.append([a, b])
    merged = []
    for g in groups:
        if len(g) >= target_num_lists:
            merged.append({x for l in g for x in l})
    return merged

number_of_matches基本上是你的Levenshtein代码,除了它只返回两个列表之间匹配单词的数量。即使这不是你想要的,这也能让你知道如何到达目的地。在

相关问题 更多 >

    热门问题