Python字典:为指定键添加值的其他实现方式有哪些?
为字典指定键添加值的替代实现方式
现有Python代码将包含作者与作品的列表转换为以作者为键、作品集合为值的字典,具体代码如下:
lst_in=['Пушкин: Сказака о рыбаке и рыбке', 'Есенин: Письмо к женщине', 'Тургенев: Муму', 'Пушкин: Евгений Онегин', 'Есенин: Русь'] D = [(L.split(": ")[0], L.split(": ")[1]) for L in lst_in] print(D) d = {} for i in D: x,y = i[0],i[1] if x not in d: d[x] = {y} else: d[x].add(y)
请问是否存在其他为字典指定键添加值的实现方式?
当然有,以下是几种更简洁的实现方式:
1. 使用collections.defaultdict
这是处理这类分组场景最常用的简化方案,defaultdict会自动为不存在的键创建指定类型的默认值(这里是set),省去手动判断键是否存在的步骤:
from collections import defaultdict lst_in=['Пушкин: Сказака о рыбаке и рыбке', 'Есенин: Письмо к женщине', 'Тургенев: Муму', 'Пушкин: Евгений Онегин', 'Есенин: Русь'] author_works = defaultdict(set) for entry in lst_in: author, work = entry.split(": ") author_works[author].add(work) # 若需要转为普通字典,可执行:author_works = dict(author_works)
2. 使用dict.setdefault()
setdefault方法会返回指定键对应的值;如果键不存在,会先将键与指定的默认值关联,再返回这个默认值。利用这个特性可以简化判断逻辑:
lst_in=['Пушкин: Сказака о рыбаке и рыбке', 'Есенин: Письмо к женщине', 'Тургенев: Муму', 'Пушкин: Евгений Онегин', 'Есенин: Русь'] author_works = {} for entry in lst_in: author, work = entry.split(": ") author_works.setdefault(author, set()).add(work)
3. 使用itertools.groupby(需先排序)
groupby可以对序列中的连续相同键进行分组,不过要注意必须先按作者对列表排序,否则无法正确分组:
from itertools import groupby lst_in=['Пушкин: Сказака о рыбаке и рыбке', 'Есенин: Письмо к женщине', 'Тургенев: Муму', 'Пушкин: Евгений Онегин', 'Есенин: Русь'] # 先按作者排序,确保相同作者的条目连续 sorted_entries = sorted(lst_in, key=lambda x: x.split(": ")[0]) author_works = {} for author, group in groupby(sorted_entries, key=lambda x: x.split(": ")[0]): # 从分组中提取所有作品,转为集合 author_works[author] = {entry.split(": ")[1] for entry in group}
内容的提问来源于stack exchange,提问作者obito
相关产品推荐
相关产品推荐

