【问题标题】:Merge Python dictionaries and sort them using their key合并 Python 字典并使用它们的键对其进行排序
【发布时间】:2020-05-26 15:10:54
【问题描述】:

我创建了 2 个 python 字典。为简单起见,

dict1 = {'apple' : 'g1', 'banana' : 'g2', 'mango' : 'g3'}

dict2 = {'grapes' : 'a1', 'pear' : 'a2', 'apple' : 'a3', 'bananabc' : 'a4'}

我想将它们合并到一个字典中,如图所示:

merge_dict = {'apple' : ['g1', 'a3'], 'banana : ['g2','a4']', 'mango' : ['g3'], 'grapes' :  ['a1'], 'pear' : ['a2']}

所以我不仅想将它们组合成一本字典,而且:

  1. 如果是相同的值,放在一个键中

  2. 如果是类似的值,例如(banana & bananabc),把它放到一个键中

  3. 否则只更新字典

可以这样做吗?

这是我尝试过的:

def match_product(name, list_names, min_score=0):

    max_score = -1
    max_name = ''

    for name2 in list_names:

        score = fuzz.token_sort_ratio(name, name2)
        if (score > min_score) & (score > max_score):
            max_name = name2
            max_score = score

    return(max_name, max_score)

【问题讨论】:

  • 是的,这是可能的。
  • 据说已经完全有可能,但是stackoverflow不会为您编写代码。您必须展示您尝试过的方法以及遇到困难的地方
  • 你知道怎么做吗?或者你有什么参考吗?@mkrieger1
  • 我已经编辑了这篇文章,你能分享一下你的想法吗? @NikosM。
  • dict1 和 dict2 - 如果以您拥有的方式声明.. 是集合.. 不是字典。要成为字典,就必须以该问题的答案显示的方式声明它们。

标签: python-3.x sorting dictionary


【解决方案1】:

试试这个:

def merge_dicts(*dicts):
    merged = {}
    for d in dicts:
        for k in d:
            if k in merged: merged[k].append(d[k])
            else: merged[k] = [d[k]]
    return merged


dict1 = {'apple' : 'g1', 'banana' : 'g2', 'mango' : 'g3'}
dict2 = {'grapes' : 'a1', 'pear' : 'a2', 'apple' : 'a3', 'banana' : 'a4'}

print(dict1)
print(dict2)
print(merge_dicts(dict1, dict2))

Online demo

{'apple': 'g1', 'banana': 'g2', 'mango': 'g3'}
{'grapes': 'a1', 'pear': 'a2', 'apple': 'a3', 'banana': 'a4'}
{'apple': ['g1', 'a3'], 'banana': ['g2', 'a4'], 'mango': ['g3'], 'grapes': ['a1'], 'pear': ['a2']}

注意默认的 python 字典 (dict) 通常不会保留键顺序。如果您需要密钥顺序,请尝试使用OrderedDict

Note2 如果需要模糊键相等,请尝试调整 merge_dicts 函数来处理它。否则我没有太多信息可以在这里回答

【讨论】:

  • 确实这是一个解决方案,但我忘了说我需要实现一个阻塞方法,这样我们就不能使用双 for 循环,因为算法需要是线性的
  • For 循环仅用于合并多个 dicts 它仍然是线性的。但是您可以将其简化为仅合并两个字典
  • 代码完美运行!但是,我想知道是否可以添加一个 elif 语句来测量来自 dict1 和 dict2 的密钥之间的差异。例如,使用 fuzz.token_sort_ratio 将相似键与合并字典中的每个键进行比较,同时仍保持算法线性? @NikosM。
  • @StevenSugi,我不知道这应该如何工作,所以我无法提供。但是,如果它需要检查每个键与其他键,那么您至少将具有二次复杂度。但我认为在你已经合并了合并的字典上的字典之后进行模糊匹配可能会更好,获取它的键并相互比较,如果它们匹配,则组合它们的值。由于我不知道这是如何在您的用例中实现的,所以我不能多说。
【解决方案2】:

这是一个解决方案:

dict1 = {'apple' : 'g1', 'banana' : 'g2', 'mango' : 'g3'}

dict2 = {'grapes' : 'a1', 'pear' : 'a2', 'apple' : 'a3', 'bananabc' : 'a4'}

merge_dict={}

for key in dict2.keys():
    merge_dict[key]=[dict2[key],]

for key in dict1.keys():
    if key in merge_dict.keys():
        merge_dict[key].append(dict1[key])
    else:
        merge_dict[key]=dict1[key]

print(merge_dict)

【讨论】:

  • 然而,这个解决方案只输出 {'grapes': ['a1'], 'pear': ['a2'], 'apple': ['a3', 'g1'], '香蕉bc':['a4']}。虽然我需要 dict 2 中没有在 dict 1 中找到的其他值
  • 现在好了..试试看。
猜你喜欢
  • 2020-08-09
  • 2022-10-04
  • 2019-09-28
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多