【问题标题】:Count Each String In A List with One Character Mismatch计算列表中的每个字符串有一个字符不匹配
【发布时间】:2023-02-25 03:35:20
【问题描述】:

我有一个字符串列表:

my_list = 'AAA AAA BBB BBB DDD DDD DDA'.split()
my_list

['AAA', 'AAA', 'BBB', 'BBB', 'DDD', 'DDD', 'DDA']

我需要计算列表中出现的每个元素。但是,如果两个字符串有一个不匹配,我们会把它们算作同一个字符串,然后进行计数。

我主要是用下面的脚本来统计。

my_list.count('AAA')

但是,不确定如何实现不匹配部分。我正在考虑运行两个for loops,比较两个字符串,然后递增计数。它将是 O(n^2)。

期望的输出

AAA 2
BBB 2
DDD 3
DDA 3

获得所需输出的理想方式是什么?任何建议,将不胜感激。谢谢!

【问题讨论】:

  • 如果还有一个与“DDA”和“AAA”相差一个错误的“DAA”怎么办?
  • 我肯定会在您的基本单词列表中以 collections.Counter() 开头。那应该减少我担心会在一些丑陋的 On2 计算中崩溃的剩余测试
  • 谷歌“编辑距离”找到计算字符串之间差异数量的算法。
  • 嗨@MichaelButscher,你是对的。然后他们的数量会增加。

标签: python string dataframe


【解决方案1】:

让我们从一个未优化的方法开始来测试两个词是否“接近”。您可能会查找或导入一个执行“Levenshtein 距离”的真实库,而不是我半生不熟的方法:

def is_close_enough(word1, word2):    # Levenshtein Distance == 1 ?
    if word1 == word2:
        return True

    if len(word1) != len(word2):
        return False

    return sum(c1==c2 for c1, c2 in zip(word1, word2)) >= len(word1) -1

print(is_close_enough("dog", "bog"))
print(is_close_enough("dog", "bot"))
print(is_close_enough("dog", "cat"))
print(is_close_enough("dog", "dogo"))

那应该给你:

True
False
False
False

现在让我们结合您的基本单词列表尝试一下。

import collections

def is_close_enough(word1, word2):    # Levenshtein Distance == 1 ?
    if word1 == word2:
        return True

    if len(word1) != len(word2):
        return False

    return sum(c1==c2 for c1, c2 in zip(word1, word2)) >= len(word1) -1

my_list = 'AAA AAA BBB BBB DDD DDD DDA'.split()
my_list_counted = collections.Counter(my_list)

print({
    word1: sum(
        count2
        for word2, count2
        in my_list_counted.items()
        if is_close_enough(word1, word2)
    )
    for word1
    in my_list_counted
})

那应该给你:

{'AAA': 2, 'BBB': 2, 'DDD': 3, 'DDA': 3}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 2022-07-08
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多