【问题标题】:Refactoring: Merging two dictionaries, but ignoring None values重构:合并两个字典,但忽略 None 值
【发布时间】:2018-10-25 15:32:59
【问题描述】:

我需要一些 Python 重构建议。

我有一个 dict 对象列表 (new_monitors),可以为空。但是,当有新监视器时,我想向这些监视器添加一堆字段。

对于每个监视器,我想从 DogDump.HIDE_FIELDS 字典中附加所有 not None 字段:

if new_monitors:
  for monitor in new_monitors:
    for key, value in DogDump.HIDE_FIELDS.items():
      if value:
        monitor[key] = value

注意:下面的这个 sn-p 工作得很好,但它包含了所有的 None 字段。我不想要 None 字段!

if new_monitors:
  for monitor in new_monitors:
    monitor.update(DogDump.HIDE_FIELDS)

如何重构这个看起来更像pythonic的sn-p,但仍然保持良好的可读性?

【问题讨论】:

  • 也许这个问题更适合CodeReview
  • 你可能是对的,我不知道这个功能存在。有没有办法移动这个问题,或者我应该在 CodeReview 部分重新创建它?我看到有一个refactoring标签,所以我就在这里。

标签: python python-3.x dictionary refactoring


【解决方案1】:

不确定在将相关键/值对添加到monitor dict 之前,哪种方式是处理您需要过滤DogDump.HIDE_FIELDS dict 的最“pythonic”方式。一种方法是使用字典理解执行“过滤”。

另外,我认为您可以在循环之前“过滤”您的 DogDump.HIDE_FIELDS dict,而不是为每次循环迭代重复此操作(除非在您迭代时发生其他操作使 DogDump.HIDE_FIELDS 发生变异)。

使用字典理解的“过滤”示例(dump 指的是您的 DogDump.HIDE_FIELDS 字典):

monitor = {'key': 'value'}
dump = {'a': 1, 'b': None}

dump_filtered = {k:v for (k,v) in dump.items() if v}
monitor.update(dump_filtered)
print(monitor)
# OUTPUT
# {'key': 'value', 'a': 1}

【讨论】:

  • 最后我决定从字典中删除None 值并使用monitor.update(DogDump.HIDE_FIELDS)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2020-08-13
  • 1970-01-01
  • 2016-01-14
  • 2012-04-19
  • 2015-04-12
  • 2021-10-24
相关资源
最近更新 更多