
一个认为一切根源都是“自己不够强”的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数
目录
巧妙用法 2:结合 filter() 和 sum() 计算满足条件的元素的总和
巧妙用法 3:结合 zip() 和 sum() 计算矩阵对角线元素的和
巧妙用法 4:结合 itertools.chain() 和 sum() 计算多个列表中所有元素的和
巧妙用法 5:结合 sorted() 和 sum() 求前 N 个最小元素的和
巧妙用法 6:结合 enumerate() 和 sum() 计算加权和
sum() 函数用于从指定的开始值 start 开始,自左向右对 iterable 中的项求和,并返回总计值。
返回 iterable 中所有项与 start 值之和。
- # 求和示例
- numbers = [1, 2, 3, 4, 5]
- total = sum(numbers)
- print(total) # 输出 15
-
- # 指定起始值的求和示例
- total_with_start = sum(numbers, 10)
- print(total_with_start) # 输出 25
-
- # 错误示例:start 值不允许为字符串
- try:
- sum(numbers, '10')
- except TypeError as e:
- print(e) # 输出 TypeError: sum() can't sum strings [use ''.join(seq) instead]
sum 在英语中意为“总和”或“加总”。当你看到 sum 时,可以立即联想到加法运算或求和。
当然,以下是 sum() 函数在不同场景中的详细使用示例,每行代码都附有注释:
- # 场景描述:你有一个包含多个数字的列表,想要计算这些数字的总和。
-
- # 定义一个包含多个数字的列表
- numbers = [1, 2, 3, 4, 5]
-
- # 使用 sum() 函数对列表中的数字求和
- total = sum(numbers)
-
- # 输出总和
- print(total) # 输出 15
- # 场景描述:你有一个包含多个数字的列表,想要在计算这些数字的总和时加上一个起始值。
-
- # 定义一个包含多个数字的列表
- numbers = [1, 2, 3, 4, 5]
-
- # 指定一个起始值
- start_value = 10
-
- # 使用 sum() 函数对列表中的数字求和,并加上起始值
- total_with_start = sum(numbers, start_value)
-
- # 输出总和
- print(total_with_start) # 输出 25
- # 场景描述:你有一个二维列表(矩阵),想要计算其中所有元素的总和。
-
- # 定义一个二维列表(矩阵)
- matrix = [
- [1, 2, 3],
- [4, 5, 6],
- [7, 8, 9]
- ]
-
- # 使用嵌套的 sum() 函数对矩阵中的所有元素求和
- total_matrix_sum = sum(sum(row) for row in matrix)
-
- # 输出总和
- print(total_matrix_sum) # 输出 45
python复制
- # 场景描述:你有一个包含多个键值对的字典,想要计算所有值的总和。
-
- # 定义一个字典,键为字符串,值为数字
- data = {
- 'a': 1,
- 'b': 2,
- 'c': 3,
- 'd': 4
- }
-
- # 使用 sum() 函数对字典中的所有值求和
- total_values = sum(data.values())
-
- # 输出总和
- print(total_values) # 输出 10
- # 场景描述:你有一个生成器表达式,想要计算其中所有生成值的总和。
-
- # 定义一个生成器表达式,用于生成 1 到 10 之间的所有数的平方
- squares_generator = (x**2 for x in range(1, 11))
-
- # 使用 sum() 函数对生成器表达式产生的所有数值求和
- total_squares_sum = sum(squares_generator)
-
- # 输出总和
- print(total_squares_sum) # 输出 385
布尔值在 Python 中可以作为整数使用,其中 True 相当于 1,False 相当于 0。我们可以利用 sum() 函数来计算列表中 True 的数量。
- # 定义一个包含布尔值的列表
- bool_list = [True, False, True, True, False]
-
- # 使用 sum() 函数计算列表中 True 的数量
- true_count = sum(bool_list)
-
- # 输出 True 的数量
- print(true_count) # 输出 3
通过 sum() 函数,我们可以将字符串中的数字字符转化为整数并计算它们的总和。
- # 定义一个包含数字字符的字符串
- num_str = "12345"
-
- # 使用 sum() 函数计算字符串中数字字符的总和
- total = sum(int(char) for char in num_str)
-
- # 输出总和
- print(total) # 输出 15
如果有一个嵌套的字典结构,可以使用递归和 sum() 函数来计算其中所有数值的总和。
- # 定义一个嵌套的字典
- nested_dict = {
- 'a': 1,
- 'b': {'c': 2, 'd': 3},
- 'e': {'f': {'g': 4, 'h': 5}}
- }
-
- # 定义一个递归函数,用于计算嵌套字典中的所有数值的总和
- def sum_nested_dict(d):
- total = 0
- for value in d.values():
- if isinstance(value, dict):
- total += sum_nested_dict(value)
- else:
- total += value
- return total
-
- # 调用递归函数并输出总和
- total_sum = sum_nested_dict(nested_dict)
- print(total_sum) # 输出 15
通过 zip() 和 sum() 函数,可以计算两个列表中对应元素的和。
- # 定义两个等长的列表
- list1 = [1, 2, 3]
- list2 = [4, 5, 6]
-
- # 使用列表推导式和 zip() 计算两个列表中对应元素的和
- sum_list = [sum(pair) for pair in zip(list1, list2)]
-
- # 输出结果列表
- print(sum_list) # 输出 [5, 7, 9]
通过 sum() 函数,可以实现多个字典的合并,并计算相同键的数值之和。
- from collections import Counter
-
- # 定义多个字典
- dict1 = {'a': 1, 'b': 2, 'c': 3}
- dict2 = {'a': 2, 'c': 4, 'd': 1}
- dict3 = {'b': 3, 'c': 1, 'd': 2}
-
- # 使用 Counter 和 sum() 函数合并字典并计算相同键的数值之和
- total_counter = sum((Counter(d) for d in [dict1, dict2, dict3]), Counter())
-
- # 输出结果字典
- print(total_counter) # 输出 Counter({'c': 8, 'b': 5, 'a': 3, 'd': 3})
这些技巧展示了 sum() 函数在处理布尔值、字符串、嵌套字典、列表和字典合并等方面的巧妙应用。通过这些特殊的用法,可以在很多场景中简化代码,提高代码的可读性和效率。
当然,sum() 函数可以与其他函数或方法相结合,创造出一些非常巧妙的用法,以下是几个这样的例子:
可以通过 map() 函数对每个元素进行平方,再用 sum() 函数计算平方和。
- # 定义一个列表
- numbers = [1, 2, 3, 4, 5]
-
- # 使用 map() 和 sum() 计算列表中所有数字的平方和
- square_sum = sum(map(lambda x: x**2, numbers))
-
- # 输出平方和
- print(square_sum) # 输出 55
通过 filter() 函数筛选满足条件的元素,再用 sum() 函数求和。
- # 定义一个列表
- numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-
- # 使用 filter() 筛选出偶数,再用 sum() 计算这些偶数的总和
- even_sum = sum(filter(lambda x: x % 2 == 0, numbers))
-
- # 输出偶数的总和
- print(even_sum) # 输出 30
可以通过 zip() 函数提取矩阵的对角线元素,再用 sum() 函数计算它们的和。
- # 定义一个矩阵
- matrix = [
- [1, 2, 3],
- [4, 5, 6],
- [7, 8, 9]
- ]
-
- # 使用 zip() 提取主对角线元素,再用 sum() 计算它们的总和
- diagonal_sum = sum(matrix[i][i] for i in range(len(matrix)))
-
- # 输出对角线元素的总和
- print(diagonal_sum) # 输出 15
可以通过 itertools.chain() 函数将多个列表连接起来,再用 sum() 函数计算总和。
- import itertools
-
- # 定义多个列表
- list1 = [1, 2, 3]
- list2 = [4, 5]
- list3 = [6, 7, 8, 9]
-
- # 使用 itertools.chain() 将多个列表连接起来,再用 sum() 计算总和
- total_sum = sum(itertools.chain(list1, list2, list3))
-
- # 输出总和
- print(total_sum) # 输出 45
可以通过 sorted() 函数对列表进行排序,再用 sum() 函数计算前 N 个最小元素的和。
- # 定义一个列表
- numbers = [10, 5, 8, 3, 7, 2, 1, 6, 4, 9]
-
- # 指定 N 的值
- N = 3
-
- # 使用 sorted() 对列表进行排序,取前 N 个最小元素,再用 sum() 计算它们的总和
- min_sum = sum(sorted(numbers)[:N])
-
- # 输出前 N 个最小元素的总和
- print(min_sum) # 输出 6 (1 + 2 + 3)
可以通过 enumerate() 函数为每个元素添加权重,再用 sum() 函数计算加权和。
- # 定义一个列表
- numbers = [1, 2, 3, 4, 5]
-
- # 使用 enumerate() 为每个元素添加权重(从 1 开始),再用 sum() 计算加权和
- weighted_sum = sum(index * number for index, number in enumerate(numbers, start=1))
-
- # 输出加权和
- print(weighted_sum) # 输出 55 (1*1 + 2*2 + 3*3 + 4*4 + 5*5)
这些例子展示了如何灵活地结合 sum() 函数与其他函数或方法,以实现不同的任务。这种组合使用方式不仅能简化代码,还能提高代码的可读性和效率。