defaultdict 在python中的基本用法

Written by

in

文章目录
  • defaultdict 的构造函数需要一个“默认工厂函数”(default_factory)作为参数。这个工厂函数是一个不接受任何参数的可调用对象,它会在访问不存在的键时被调用,并将其返回值作为该键的默认值。 from collections import defaultdict # 使用 int 作为默认工厂函数,意味着当访问不存在的键时,会创建一个默认值为 0 的新条目。 # int() 会返回 0 word_counts = defaultdict(int) # 访问一个不存在的键 ‘apple’,它会自动创建并赋值为 int() 的结果 (0) print(word_counts[‘apple’]) # 输出: 0 # 现在 ‘apple’ 键存在了,我们可以像普通字典一样操作它 word_counts[‘apple’] += 1 print(word_counts[‘apple’]) # 输出: 1 word_counts[‘banana’] += 1 word_counts[‘apple’] += 1 print(word_counts) # 输出: defaultdict(<class ‘int’>, {‘apple’: 2, ‘banana’: 1})
  • defaultdict 主要用于简化代码,避免在使用普通字典时频繁地检查键是否存在。这在以下场景中特别有用: 计数 (Counting): 统计列表中元素的出现次数,或字符串中字符的出现次数。 使用普通字典: counts = {} my_list = [‘apple’, ‘banana’, ‘apple’, ‘orange’, ‘banana’, ‘apple’] for item in my_list: if item in counts: counts[item] += 1 else: counts[item] = 1 print(counts) 使用 defaultdict(int): from collections import defaultdict counts = defaultdict(int) my_list = [‘apple’, ‘banana’, ‘apple’, ‘orange’, ‘banana’, ‘apple’] for item in my_list: counts[item] += 1 # 如果 ‘item’ 不存在,会自动创建为 0,然后加 1 print(counts) 显然,defaultdict 的代码更简洁。 分组 (Grouping): 将具有相同特征的元素分组。例如,根据首字母将单词分组。 使用普通字典: words_by_initial = {} words = [‘apple’, ‘banana’, ‘apricot’, ‘cat’, ‘dog’] for word in words: initial = word[0] if initial in words_by_initial: words_by_initial[initial].append(word) else: words_by_initial[initial] = [word] print(words_by_initial) 使用 defaultdict(list): from collections import defaultdict words_by_initial = defaultdict(list) words = [‘apple’, ‘banana’, ‘apricot’, ‘cat’, ‘dog’] for word in words: initial = word[0] words_by_initial[initial].append(word) # 如果 ‘initial’ 不存在,会自动创建为空列表 [] print(words_by_initial) 这里,list 作为默认工厂函数,当访问不存在的键时,会创建一个空列表。 累加/聚合 (Accumulating/Aggregating): 对某个键下的值进行累加或进行其他聚合操作。 假设你有一些销售数据,想要计算每个产品的总销售额: from collections import defaultdict sales_data = [ {‘product’: ‘A’, ‘amount’: 100}, {‘product’: ‘B’, ‘amount’: 50}, {‘product’: ‘A’, ‘amount’: 75}, {‘product’: ‘C’, ‘amount’: 200}, {‘product’: ‘B’, ‘amount’: 120}, ] total_sales = defaultdict(float) # 或者 int,根据你的数据类型 for item in sales_data: product = item[‘product’] amount = item[‘amount’] total_sales[product] += amount print(total_sales) # 输出: defaultdict(<class ‘float’>, {‘A’: 175.0, ‘B’: 170.0, ‘C’: 200.0})
  • defaultdict 的 default_factory 可以是任何可调用对象,而不仅仅是内置类型(如 int、list、set)。 int: 默认值为 0。 d = defaultdict(int) print(d[‘a’]) # 0 list: 默认值为 []。 d = defaultdict(list) d[‘a’].append(1) print(d) # defaultdict(<class ‘list’>, {‘a’: [1]}) set: 默认值为 set()。 d = defaultdict(set) d[‘a’].add(1) d[‘a’].add(2) print(d) # defaultdict(<class ‘set’>, {‘a’: {1, 2}}) str: 默认值为 ''。 d = defaultdict(str) print(d[‘a’]) # ” 自定义函数: def create_default_value(): return “Not Found” d = defaultdict(create_default_value) print(d[‘unknown_key’]) # Not Found lambda 表达式: d = defaultdict(lambda: {‘count’: 0, ‘items’: []}) d[‘product1’][‘count’] += 1 d[‘product1’][‘items’].append(‘item_x’) print(d[‘product1’]) # {‘count’: 1, ‘items’: [‘item_x’]}
  • 在某些情况下,dict.setdefault() 也可以实现类似的功能,但 defaultdict 通常更简洁高效。 dict.setdefault(key, default_value) 方法会在字典中查找 key。如果 key 存在,则返回其对应的值;如果 key 不存在,则将 key 插入字典并赋值为 default_value,然后返回 default_value。 使用 dict.setdefault() 进行计数: counts = {} my_list = [‘apple’, ‘banana’, ‘apple’] for item in my_list: counts[item] = counts.setdefault(item, 0) + 1 print(counts) # {‘apple’: 2, ‘banana’: 1} 使用 dict.setdefault() 进行分组: words_by_initial = {} words = [‘apple’, ‘banana’, ‘apricot’] for word in words: initial = word[0] words_by_initial.setdefault(initial, []).append(word) print(words_by_initial) # {‘a’: [‘apple’, ‘apricot’], ‘b’: [‘banana’]} 对比: 简洁性: defaultdict 在很多情况下代码更简洁,因为它省去了显式的条件判断或 setdefault 调用。 性能: 对于大量操作,defaultdict 通常比重复调用 setdefault 稍微快一些,因为它避免了每次访问时都可能进行的键查找和方法调用开销。 语义: defaultdict 明确表达了“如果键不存在,就创建一个默认值”的意图,使得代码更易读。 灵活性: defaultdict 允许你指定一个工厂函数,而 setdefault 每次都需要提供一个具体的默认值。虽然 setdefault 也可以结合函数调用,但不如 defaultdict 的设计直接。 到此这篇关于defaultdict 在python中的作用的文章就介绍到这了,更多相关defaultdict python内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python中使用defaultdict和Counter的方法 详解Python中defaultdict的具体使用 Python dict和defaultdict使用实例解析 在Python中使用defaultdict初始化字典以及应用方法 Python中的defaultdict与__missing__()使用介绍 Python使用defaultdict读取文件各列的方法 Python标准库defaultdict模块使用示例
  • 目录
    • defaultdict 的基本用法
    • 为什么使用 defaultdict?
    • defaultdict 的工厂函数
    • defaultdict 与 dict.setdefault() 的比较

    collections.defaultdict 是 Python collections 模块中提供的一个字典(dict)的子类。它与普通的字典非常相似,但有一个关键的区别:当你尝试访问一个不存在的键时,defaultdict 不会引发 KeyError 异常,而是会自动为该键生成一个默认值。

    defaultdict 的构造函数需要一个“默认工厂函数”(default_factory)作为参数。这个工厂函数是一个不接受任何参数的可调用对象,它会在访问不存在的键时被调用,并将其返回值作为该键的默认值。

    from collections import defaultdict
    # 使用 int 作为默认工厂函数,意味着当访问不存在的键时,会创建一个默认值为 0 的新条目。
    # int() 会返回 0
    word_counts = defaultdict(int)
    # 访问一个不存在的键 'apple',它会自动创建并赋值为 int() 的结果 (0)
    print(word_counts['apple'])  # 输出: 0
    # 现在 'apple' 键存在了,我们可以像普通字典一样操作它
    word_counts['apple'] += 1
    print(word_counts['apple'])  # 输出: 1
    word_counts['banana'] += 1
    word_counts['apple'] += 1
    print(word_counts)  # 输出: defaultdict(<class 'int'>, {'apple': 2, 'banana': 1})

    defaultdict 主要用于简化代码,避免在使用普通字典时频繁地检查键是否存在。这在以下场景中特别有用:

    计数 (Counting): 统计列表中元素的出现次数,或字符串中字符的出现次数。

    使用普通字典:

    counts = {}
    my_list = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
    for item in my_list:
        if item in counts:
            counts[item] += 1
        else:
            counts[item] = 1
    print(counts)

    使用 defaultdict(int)

    from collections import defaultdict
    counts = defaultdict(int)
    my_list = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
    for item in my_list:
        counts[item] += 1  # 如果 'item' 不存在,会自动创建为 0,然后加 1
    print(counts)

    显然,defaultdict 的代码更简洁。

    分组 (Grouping): 将具有相同特征的元素分组。例如,根据首字母将单词分组。

    使用普通字典:

    words_by_initial = {}
    words = ['apple', 'banana', 'apricot', 'cat', 'dog']
    for word in words:
        initial = word[0]
        if initial in words_by_initial:
            words_by_initial[initial].append(word)
        else:
            words_by_initial[initial] = [word]
    print(words_by_initial)

    使用 defaultdict(list)

    from collections import defaultdict
    words_by_initial = defaultdict(list)
    words = ['apple', 'banana', 'apricot', 'cat', 'dog']
    for word in words:
        initial = word[0]
        words_by_initial[initial].append(word) # 如果 'initial' 不存在,会自动创建为空列表 []
    print(words_by_initial)

    这里,list 作为默认工厂函数,当访问不存在的键时,会创建一个空列表。

    累加/聚合 (Accumulating/Aggregating): 对某个键下的值进行累加或进行其他聚合操作。

    假设你有一些销售数据,想要计算每个产品的总销售额:

    from collections import defaultdict
    sales_data = [
        {'product': 'A', 'amount': 100},
        {'product': 'B', 'amount': 50},
        {'product': 'A', 'amount': 75},
        {'product': 'C', 'amount': 200},
        {'product': 'B', 'amount': 120},
    ]
    total_sales = defaultdict(float) # 或者 int,根据你的数据类型
    for item in sales_data:
        product = item['product']
        amount = item['amount']
        total_sales[product] += amount
    print(total_sales)
    # 输出: defaultdict(<class 'float'>, {'A': 175.0, 'B': 170.0, 'C': 200.0})

    defaultdict 的 default_factory 可以是任何可调用对象,而不仅仅是内置类型(如 intlistset)。

    int: 默认值为 0

    d = defaultdict(int)
    print(d['a']) # 0

    list: 默认值为 []

    d = defaultdict(list)
    d['a'].append(1)
    print(d) # defaultdict(<class 'list'>, {'a': [1]})

    set: 默认值为 set()

    d = defaultdict(set)
    d['a'].add(1)
    d['a'].add(2)
    print(d) # defaultdict(<class 'set'>, {'a': {1, 2}})

    str: 默认值为 ''

    d = defaultdict(str)
    print(d['a']) # ''

    自定义函数:

    def create_default_value():
        return "Not Found"
    d = defaultdict(create_default_value)
    print(d['unknown_key']) # Not Found

    lambda 表达式:

    d = defaultdict(lambda: {'count': 0, 'items': []})
    d['product1']['count'] += 1
    d['product1']['items'].append('item_x')
    print(d['product1']) # {'count': 1, 'items': ['item_x']}

    在某些情况下,dict.setdefault() 也可以实现类似的功能,但 defaultdict 通常更简洁高效。

    dict.setdefault(key, default_value) 方法会在字典中查找 key。如果 key 存在,则返回其对应的值;如果 key 不存在,则将 key 插入字典并赋值为 default_value,然后返回 default_value

    使用 dict.setdefault() 进行计数:

    counts = {}
    my_list = ['apple', 'banana', 'apple']
    for item in my_list:
        counts[item] = counts.setdefault(item, 0) + 1
    print(counts) # {'apple': 2, 'banana': 1}

    使用 dict.setdefault() 进行分组:

    words_by_initial = {}
    words = ['apple', 'banana', 'apricot']
    for word in words:
        initial = word[0]
        words_by_initial.setdefault(initial, []).append(word)
    print(words_by_initial) # {'a': ['apple', 'apricot'], 'b': ['banana']}

    对比:

    • 简洁性defaultdict 在很多情况下代码更简洁,因为它省去了显式的条件判断或 setdefault 调用。
    • 性能: 对于大量操作,defaultdict 通常比重复调用 setdefault 稍微快一些,因为它避免了每次访问时都可能进行的键查找和方法调用开销。
    • 语义defaultdict 明确表达了“如果键不存在,就创建一个默认值”的意图,使得代码更易读。
    • 灵活性defaultdict 允许你指定一个工厂函数,而 setdefault 每次都需要提供一个具体的默认值。虽然 setdefault 也可以结合函数调用,但不如 defaultdict 的设计直接。

    到此这篇关于defaultdict 在python中的作用的文章就介绍到这了,更多相关defaultdict python内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python中使用defaultdict和Counter的方法
    • 详解Python中defaultdict的具体使用
    • Python dict和defaultdict使用实例解析
    • 在Python中使用defaultdict初始化字典以及应用方法
    • Python中的defaultdict与__missing__()使用介绍
    • Python使用defaultdict读取文件各列的方法
    • Python标准库defaultdict模块使用示例

    站内搜索