【问题标题】:how can I refactor or friendly programmer view? [closed]如何重构或友好的程序员视图? [关闭]
【发布时间】:2026-02-08 21:15:02
【问题描述】:

我想将其转换为团队中其他程序员的可读性更高,但我不确定如何正确重构这个合并两个 dict 的函数,并根据值删除重复项

def mergeDict(json1, json2):
    cveids = set([n['id'] for n in json1]).union(set([n['id'] for n in json2]))

    jf1={s['id']:s['url'] for s in json1}
    jf2={s['id']:s['url'] for s in json2}

    return [{'id':cveid,'url':list(set(jf1.get(cveid,[])+jf2.get(cveid,[])))} for cveid in cveids]
    ```

标签: python coding-style refactoring


【解决方案1】:

当您与新手程序员一起工作时,分开做事是让他们更容易理解代码的良好开端。

例如:

def mergeDict(json1, json2):
    cveids1 = set([n['id'] for n in json1])
    cveids2 = set([n['id'] for n in json2])
    cveids = cveids1.union(cveids2)

    jf1={s['id']:s['url'] for s in json1}
    jf2={s['id']:s['url'] for s in json2}

    def makeUniq(cveid):
        urls1 = jf1.get(cveid, [])
        urls2 = jf2.get(cveid, [])
        urls = list(set(urls1 + urls2))
        return { 'id': cveid, 'url': urls }

    return [makeUniq(cveid) for cveid in sorted(list(cveids))]

列表推导对性能有好处,但会在做复杂的事情时造成混乱。对于初学者来说,最好使用简单的“for”语法(最好),或者像我一样使用辅助函数来应用理解(也许)。

好名字也是值得期待的。我开始思考“什么是 'cveids'?为什么不是键?”,但我保留了您的命名变量,因为我不了解您的业务,并且这些名称可能在上下文中具有表达性。

【讨论】:

  • cveids 表示 ids,因为我使用的是基于上下文的变量,但另一件事是正常的,每个执行 id 随机变化,就像它是 random or choice?
  • 是的,如果不是在受控上下文中创建的随机 id 是正常的。
  • 如果示例 id 类似于 CVE-{year}-{id} 其中年份和 id 都只有 0-9 位,我该如何订购,而我只想通过 year-number 订购
  • 好吧,对于这种格式的 id,您可以使用“cveids = sort(list(cveids))”。我认为这将解决这个问题。
  • 如果你想把它应用到结果列表中,你可以做"sort(mergeDict(json1, json2), key=lambda x: x["id"])