【问题标题】:Python - Populate dictionary from nested dictionary comprehensionPython - 从嵌套字典理解中填充字典
【发布时间】:2016-11-25 15:38:01
【问题描述】:

我想通过遍历其他两个字典来填充字典。我有一个工作示例,我想知道是否有一种方法可以在字典理解中做到这一点(主要是出于性能原因)或使其更加 Pythonic。首先是代码:

def get_replacement_map(dict_A, dict_B, min_sim):
    replacement_map = {}  # the dictionary i want to populate

    for key_A, value_A in dict_A.items():

        best_replacement = ()
        best_similarity = 0

        for key_B, value_B in dict_B.items():

            if key_B[0] != key_A[0]:

                # similarity(x,y) may return None so in that case assign sim = 0
                sim = similarity(value_A[0], value_B[0]) or 0
                if sim > best_similarity and sim > min_sim:
                    best_replacement = key_B
                    best_similarity = sim

                    if sim > 0.9:  # no need to keep looking, this is good enough!
                        break

        if best_replacement:
            synonym_map[key_A] = best_replacement

    return replacement_map 

它做了一件简单的事情。它计算两个字典的元素之间的相似度,并为每个元素找到最佳可能的替换(如果相似度高于 min_sim 阈值)。目的是建立一个替换字典。

我是 Python 新手,所以我很确定这不是 Python 的实现方式。通过使用推导而不是 for 循环,我已经看到性能有了很大的改进,所以我很好奇这段代码是否也可以使用嵌套字典推导来完成,以及这样做是否有意义。

如果使用推导不是一个好主意,我可以做些什么改进?

【问题讨论】:

  • 有一点需要提一下(这与其说是一个直接的答案,不如说是一个注释)是您对dict.items() 的使用。尽管在 python3 中绝对比 it was in python 2 好得多,但通过迭代字典键而不是 for key in dict,然后使用 dict[key] 调用值,可能值得看到性能改进。
  • @RNar 谢谢,我会试试的。

标签: python python-3.x dictionary dictionary-comprehension


【解决方案1】:

这是一个足够复杂的替换模式,如果您将其全部包含在一行中,将很难阅读。保持与使流程易于理解相关的结构和间距是解决此问题的更 Pythonic 方式。

至于性能提升,您可能不会看到this 问题中讨论的任何内容。

【讨论】:

  • 如果我做出有根据的猜测,您的最佳性能提升将来自优化 similarity() 函数和使用 cython
  • 你是对的,但是相似度函数是来自 3rd-party 库的函数,我无能为力。
猜你喜欢
  • 1970-01-01
  • 2018-01-20
  • 2021-07-24
  • 2013-07-28
  • 2011-06-06
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多