【问题标题】:All pair comparison of string values in two dictionaries两个字典中字符串值的所有对比较
【发布时间】:2013-10-12 02:39:55
【问题描述】:

我有两个字典,dict1 和 dict2。字典包含作为 ID 的键和作为字符串的值。我需要对 dict1 中的所有值与 dict2 中的所有其他值进行所有对比较。

我正在使用以下代码,它运行良好,但速度很慢。我的实际数据在每个字典中包含大约 100,000 个值。有没有其他“有效”的方法可以做到这一点。

import difflib
dict1 = {"111": "asdfa", "222":"gdjkgd", "333":"xvbkx"}
dict2 = {"311": "asdfa", "322":"gdjkzxgd", "333":"xvvbkx"}
qKeys = sorted(dict2.keys())
#Write the header in outfile
nline = "ref"+ "\t" + "\t".join(qKeys) + "\n"
print(nline)
for item in dict1:
    ratioArr = []
    refseq = dict1[item]
    for qitem in qKeys:
        qSeq = dict2[qitem]
        myratio = round(difflib.SequenceMatcher(None, refseq, qSeq).ratio(),2)
        ratioArr.append(str(myratio))
    #print(myratio)
    nline = item + "\t" + "\t".join(ratioArr)+"\n"
    print(nline)

【问题讨论】:

  • 我会考虑使用Pandas DataFrame。您可以拥有 ID 的索引(在您的示例中为 dict 键)。然后执行外连接操作并应用一个对结果进行比较的函数。当然,使用dict 可以做到这一点,但看起来你确实需要一些关于 ID 的关系逻辑,然后应用任意一段代码(比较操作)。这就是 Pandas 擅长的。
  • 谢谢@EMS,你介意举一个简单的例子来说明如何做到这一点。
  • jellyfish 库中的一个距离度量(可能是 jaro)可能适用。这是一个example answer,它打印出一定距离的单词,但您也可以轻松打印出距离本身......

标签: python pandas


【解决方案1】:

我的建议是,首先,使用比 difflib 更快的东西,它是纯 python。

您应该检查是否可以使用levenshtein distance。如果可以,您可以使用pylevenshtein

最后,您遇到了决定哪个字符串匹配哪个字符串的问题——那就是assignment problem。可以使用hungarian algorithm 有效地解决它。该算法的一个常用实现是munkres

【讨论】:

  • 谢谢,pylevenshtein 包比 difflib SequenceMatcher 函数快一个数量级以上。我使用了其中的ratio 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多