在 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条目?