在 Python 中填充字典的更惯用的方法

Posted

技术标签:

【中文标题】在 Python 中填充字典的更惯用的方法【英文标题】:A more idiomatic way to fill a dictionary in Python 【发布时间】:2012-06-23 23:00:43 【问题描述】:

目前,我正在尝试用 Python 填充字典,但我认为我正在做的事情有点多余。有没有更 Pythonic 的方式来执行以下操作:

if not pattern_file_map.get(which_match):
    pattern_file_map[which_match] = [line]
else:
    pattern_file_map[which_match].append(line)

pattern_file_map 是一个字典。

我知道在检查字典中是否有键时可以使用某种习语,例如 this question,但我只想用列表填充这本字典。

【问题讨论】:

【参考方案1】:

你可以使用

pattern_file_map.setdefault(which_match, []).append(line)

改为。

其他人可能会建议改用 collections.defaultdict(list),这是另一种选择,但请注意,这可能会隐藏错误,因为它会默默地创建您访问的所有密钥。

【讨论】:

您可以通过将default_factory 属性设置为None 来使defaultdict 像普通字典一样工作(这会使代码更难看)。 @StevenRumbalski:好点。 (请注意,我完全不反对使用defaultdict。)【参考方案2】:

您可以尝试使用collections.defaultdict。

【讨论】:

【参考方案3】:

由于您要添加到可能存在的值:

pattern_file_map.setdefault(which_match, []).append(line)

如果使用dict.get()

li = pattern_file_map.get(which_match, [])
li.append(line)
pattern_file_map[which_match] = li

当然,这两种情况都仅限于您的 dict 的值是列表的情况。

【讨论】:

pattern_file_map.get(which_match, []) 和 pattern_file_map.setdefault(which_match, []) 有什么区别? .get(key,default) 返回一个值或默认值(没有设置),并且需要重新分配到字典中。在这种情况下,.setdefault(key,default) 是更好的选择。我更正了我的答案。

以上是关于在 Python 中填充字典的更惯用的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用惯用的Scala替换(填充)来自另一个列表的选项列表中的None条目?

在 tableview 中填充数组字典的高效和干净的方法

Python,如何使用字典填充数据框中的空值

用python.检查“影片名称”字段为空值的+数据,给该字段填充数+据"unnamed"?

用 Pandas 数据框中的行填充嵌套字典

使用 Python 使用嵌套字典填充 MongoDB 数据库