【Python学习】列表/元组等容器的常用内置函数详解

news2025/4/7 19:14:35

文章目录

    • map
      • 使用示例:
    • filter
      • 示例:
      • 注意事项:
    • sorted
      • `sorted()` 与 `list.sort()` 的区别:
    • any
      • 示例:
    • all
      • 示例:
    • any 与 all 的对比
    • zip
      • 示例:
      • 常见用途:
    • enumerate
      • 示例:
      • 常见用途:
    • reverse
      • 示例:
      • 注意:
    • sum
      • 示例:
      • 注意事项:
    • max / min
      • 1. `max()` 函数
        • 示例:
      • 2. `min()` 函数
        • 示例:
      • 3. `max()` 与 `min()` 的共同特性
      • 4. 注意事项

map

map() 用于将指定函数应用于给定可迭代对象(列表、元组等)的每个元素,并返回一个由结果组成的迭代器。

语法:

map(function, iterable, ...)
  • function: 用于处理每个元素的函数。
  • iterable: 一个或多个可迭代对象(如列表、元组等)。
  • 如果传入多个可迭代对象,function 必须接受相同数量的参数。

返回值:

map() 函数返回一个迭代器,它可以生成应用 function 后的结果。如果需要结果为列表或其他数据结构,可以通过 list()tuple() 将其转换。

使用示例:

1. 基本示例:

假设我们有一个列表,想要将每个元素加倍:

def double(x):
    return x * 2

numbers = [1, 2, 3, 4]
result = map(double, numbers)

# 将map对象转换为列表查看结果
result_list = list(result)
print(result_list)  # 输出: [2, 4, 6, 8]

对于上面的代码,如果不想单独定义一个函数,可以使用 lambda 表达式:

numbers = [1, 2, 3, 4]
result = map(lambda x: x * 2, numbers)

result_list = list(result)
print(result_list)  # 输出: [2, 4, 6, 8]

2. 多个可迭代对象:
map() 可以接受多个可迭代对象,并且 function 必须能够接受多个参数。它会并行地对多个可迭代对象的元素进行操作。

def add(x, y):
    return x + y

a = [1, 2, 3]
b = [4, 5, 6]
result = map(add, a, b)

result_list = list(result)
print(result_list)  # 输出: [5, 7, 9]

3. 处理不同长度的可迭代对象:
如果传入的可迭代对象长度不相等,map() 会根据最短的可迭代对象的长度进行迭代。

a = [1, 2, 3]
b = [4, 5]
result = map(add, a, b)

result_list = list(result)
print(result_list)  # 输出: [5, 7]

filter

filter() 用于从可迭代对象中过滤出符合条件的元素。filter() 函数会遍历给定的可迭代对象,并将符合特定条件的元素返回。

语法:

filter(function, iterable)
  • function:这是一个用于过滤的函数,它接收可迭代对象的每个元素并返回布尔值 TrueFalse
    • 如果返回 True,则该元素将被保留。
    • 如果返回 False,则该元素将被过滤掉。
  • iterable:可迭代对象(如列表、元组、集合等),即希望从中筛选元素的对象。

返回值:

  • filter() 函数返回一个 迭代器,我们可以使用 list()tuple() 等函数将其转换为列表或元组等其他数据结构。

示例:

示例 1:过滤偶数

使用 filter() 函数来从一个数字列表中筛选出偶数:先定义一个函数,该函数检查一个数是否是偶数。后将其传递给 filter() 函数。

# 定义一个函数,判断一个数字是否为偶数
def is_even(x):
    return x % 2 == 0

# 一个包含整数的列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 使用 filter 函数筛选出偶数
even_numbers = filter(is_even, numbers)

# 将 filter 对象转换为列表,并打印结果
print(list(even_numbers))  # 输出: [2, 4, 6, 8]

示例 2:过滤大于 5 的数字(lambda)
从一个列表中筛选出所有大于 5 的数字,使用 filter() 配合一个 lambda 表达式来实现。

# 使用 lambda 函数判断数字是否大于 5
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 使用 filter 筛选大于 5 的数字
greater_than_five = filter(lambda x: x > 5, numbers)

# 将 filter 对象转换为列表,并打印结果
print(list(greater_than_five))  # 输出: [6, 7, 8, 9]

示例 3:过滤空字符串

有一个包含字符串的列表,希望过滤掉其中的空字符串,只保留非空字符串。

# 一个包含字符串的列表
strings = ["apple", "", "banana", "", "cherry", ""]

# 使用 filter 筛选出非空字符串
non_empty_strings = filter(None, strings)

# 将 filter 对象转换为列表,并打印结果
print(list(non_empty_strings))  # 输出: ['apple', 'banana', 'cherry']

在这个例子中,None 被作为 filter() 的第一个参数。Python 会将 None 视为布尔值 FalseTrue。空字符串被视为 False,而非空字符串被视为 True,因此空字符串会被过滤掉。

注意事项:

  1. 返回类型filter() 函数返回的是一个 迭代器,而不是一个列表。如果需要结果是列表或其他类型的集合,要显式地将其转换为列表或其他数据结构,比如使用 list()tuple() 等。

  2. 使用 None 作为函数:当 filter() 的第一个参数是 None 时,它会对可迭代对象中的每个元素进行布尔值检查。空值(如 None0"" 等)会被视为 False,其他值则视为 True

  3. 性能filter() 使用惰性评估,即它不会立即处理所有元素,而是按需生成结果。这使得 filter() 在处理大数据集时非常高效。

    # 生成一个大列表
    numbers = list(range(1, 1000000))
    
    # 使用 filter 筛选出偶数
    even_numbers = filter(lambda x: x % 2 == 0, numbers)
    
    # 将 filter 对象转换为列表,并打印前 10 个元素
    print(list(even_numbers)[:10])  # 输出: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
    

    在处理大数据集时,filter() 是非常高效的,因为它是惰性求值的,只有在需要时才会进行计算。


sorted

sorted() 用于对可迭代对象进行排序。它返回一个新的排好序的列表,而不会改变原有的可迭代对象。sorted 可以用来对列表、元组、字符串、字典等可迭代对象进行排序。

语法:

sorted(iterable, key=None, reverse=False)
  • iterable:必须提供一个可迭代对象(如列表、元组、字符串等)作为输入。
  • key:一个函数,用来从每个元素中提取出用于比较的值,默认为 None。如果提供了 key 函数,它会对可迭代对象中的每个元素调用该函数,返回值将用于排序。key 参数常用于自定义排序的需求。
  • reverse:布尔值,默认为 False,表示按升序排序。如果设置为 True,则按降序排序。

返回值

  • sorted() 返回一个新的列表,包含排好序的元素。

示例 1:基本排序

  1. 如果没有提供 keyreverse 参数,sorted() 会按升序对可迭代对象进行排序。
  2. 通过设置 reverse=True,可以按降序对元素进行排序。
numbers = [4, 2, 9, 1, 5, 6]

# 按升序排序
sorted_numbers = sorted(numbers)
# 按降序排序
sorted_numbers_desc = sorted(numbers, reverse=True)

print(sorted_numbers)  # 输出: [1, 2, 4, 5, 6, 9]
print(sorted_numbers_desc)  # 输出: [9, 6, 5, 4, 2, 1]

示例 2:使用 key 参数进行排序
key 参数通常与自定义函数或 lambda 表达式一起使用,用于指定排序规则。它会根据返回的值对元素进行排序。

# 按字符串长度排序
words = ["banana", "apple", "kiwi", "orange"]

# 使用 key 参数按字符串的长度排序
sorted_words = sorted(words, key=len)

print(sorted_words)  # 输出: ['kiwi', 'apple', 'banana', 'orange']

在这个例子中,key=len 表示使用字符串的长度作为排序依据。

示例 3:对元组列表进行排序
对于包含元组的列表,可以指定按元组的某个元素进行排序。

# 一个包含元组的列表
people = [("Alice", 30), ("Bob", 25), ("Charlie", 35), ("David", 20)]

# 按年龄(元组的第二个元素)排序
sorted_people = sorted(people, key=lambda x: x[1])

print(sorted_people)  # 输出: [('David', 20), ('Bob', 25), ('Alice', 30), ('Charlie', 35)]

示例 4:排序字符串
字符串可以按字母顺序进行排序。

# 字符串
text = "hello"

# 将字符串按字母顺序排序
sorted_text = sorted(text)

print(sorted_text)  # 输出: ['e', 'h', 'l', 'l', 'o']

示例 5:自定义排序规则
可以通过传递自定义的 key 函数来创建复杂的排序规则。

# 自定义排序规则,按字符串的最后一个字母排序
words = ["banana", "apple", "kiwi", "orange"]

# 按最后一个字母排序
sorted_words = sorted(words, key=lambda x: x[-1])

print(sorted_words)  # 输出: ['banana', 'kiwi', 'orange', 'apple']

示例 6:排序字典
如果想对字典进行排序,通常可以选择按键或按值排序。

  1. 按字典的键排序:
# 一个字典
grades = {"Alice": 88, "Bob": 95, "Charlie": 85, "David": 92}

# 按字典的键排序
sorted_grades_by_key = sorted(grades)

print(sorted_grades_by_key)  # 输出: ['Alice', 'Bob', 'Charlie', 'David']
  1. 按字典的值排序:
    如果需要按字典中的值排序,可以使用 key 参数,指定根据值进行排序。
# 按字典的值排序
sorted_grades_by_value = sorted(grades.items(), key=lambda x: x[1])

print(sorted_grades_by_value)  # 输出: [('Charlie', 85), ('Alice', 88), ('David', 92), ('Bob', 95)]

示例 7:对嵌套列表排序
如果有一个嵌套列表,想要根据某个子元素进行排序,可以用 key 来指定排序的依据。

# 一个嵌套列表
nested_list = [[3, 4], [1, 2], [5, 6], [2, 7]]

# 按每个子列表的第一个元素排序
sorted_nested_list = sorted(nested_list, key=lambda x: x[0])

print(sorted_nested_list)  # 输出: [[1, 2], [2, 7], [3, 4], [5, 6]]

性能

  • sorted() 使用 Timsort 算法,这是一种混合排序算法,具有 O(n log n) 的时间复杂度。对于大部分数据集,sorted() 是非常高效的。
  • 它会返回一个新的列表,原始的可迭代对象不会被修改。

sorted()list.sort() 的区别:

  • sorted() 是一个内置函数,它返回一个新的排好序的列表,而不会修改原始对象。
  • list.sort() 是列表对象的方法,它直接修改列表本身,排序是就地进行的,并且它不会返回任何值。

any

any() 用于判断一个可迭代对象中的元素是否至少有一个为 True。如果是,则返回 True,否则返回 False。在检查过程中,any() 会依次遍历可迭代对象的元素,一旦发现有一个元素的值为 True,它就会立即返回 True,不再继续检查后续元素。如果没有元素为 True,则返回 False

语法:

any(iterable)
  • iterable:一个可迭代对象(如列表、元组、集合等),可以是任意类型的对象,只要它是可迭代的。

返回值:

  • 如果 iterable 中至少有一个元素为 True,则返回 True
  • 如果 iterable 中没有任何元素为 True,或者 iterable 为空,返回 False

特点:

  • any() 会对整个可迭代对象进行遍历。
  • 对于任何空的可迭代对象,any() 总是返回 False,这是因为没有元素可以为 True
  • any() 判断的是元素的布尔值,意味着它会自动将元素转换为布尔值进行判断。

示例:

示例 1:基本用法

values = [0, 1, 2, 3]
result = any(values)

print(result)  # 输出: True

在这个例子中,values 列表中的元素有 0(False)和 1, 2, 3(True)。因为列表中至少有一个元素为 True,所以 any() 返回 True

示例 2:没有任何 True 的元素

values = [0, False, None]
result = any(values)

print(result)  # 输出: False

列表 values 中的所有元素都被认为是 False0FalseNone),所以 any() 返回 False

示例 3:空可迭代对象

values = []
result = any(values)

print(result)  # 输出: False

对于空的可迭代对象,any() 始终返回 False,因为没有元素可以为 True

示例 4:判断字符串是否包含非空字符

strings = ["", "", "hello", ""]
result = any(strings)

print(result)  # 输出: True

在这个例子中,字符串列表中有一个非空字符串 "hello",它被视为 True,因此 any() 返回 True

示例 5:与条件结合使用
any() 可以与条件语句结合,检查某些条件是否满足。比如,检查一个列表中的数字是否大于 10。

numbers = [1, 5, 10, 15]
result = any(num > 10 for num in numbers)

print(result)  # 输出: True

在这个例子中,我们使用 any() 与生成器表达式结合,检查列表中是否有任何一个数字大于 10。因为 15 满足条件,所以返回 True

示例 6:与自定义函数结合使用
可以将 any() 与自定义函数结合使用,来判断是否存在符合某种条件的元素。

students = [
    {"name": "Alice", "age": 20},
    {"name": "Bob", "age": 25},
    {"name": "Charlie", "age": 19}
]

result = any(student["age"] >= 21 for student in students)

print(result)  # 输出: True

在这个例子中,any() 与生成器表达式结合使用,检查是否有学生年龄大于等于 21。如果有,返回 True,否则返回 False

示例 7:非布尔值元素
any() 对非布尔值的元素进行布尔转换。Python 中的 0NoneFalse,空字符串,空列表等都会被认为是 False,其余的都被认为是 True

values = [0, "", [], {}, 1]
result = any(values)

print(result)  # 输出: True

在这个例子中,values 列表包含多个 “假” 值(0,空字符串,空列表,空字典)和一个 “真” 值(1)。因为有 1 这个元素,any() 返回 True

性能

  • any() 会在找到第一个 True 元素时就停止遍历,这使得它比检查所有元素的方式更加高效。
  • 如果可迭代对象中的第一个元素为 True,它会立即返回 True,避免对后续元素的检查。

all

all()用于判断一个可迭代对象中的所有元素是否都为 True。如果可迭代对象中的所有元素都为 True,则返回 True,否则返回 False。如果可迭代对象为空,all() 也会返回 True,因为没有元素违反条件。

语法:

all(iterable)
  • iterable:一个可迭代对象(如列表、元组、集合等)。它可以是任何类型的可迭代对象。

返回值:

  • 如果 iterable 中的所有元素都为 True,返回 True
  • 如果 iterable 中有一个元素为 False,返回 False
  • 如果 iterable 为空,返回 True

特点:

  • all() 会检查可迭代对象中的所有元素。
  • 一旦发现任何元素的布尔值为 Falseall() 就会停止检查并返回 False,否则会返回 True
  • 对于空的可迭代对象,all() 会返回 True。这是因为空集合没有元素来满足 False,因此按逻辑推断返回 True

示例:

示例 1:所有元素为 True / 部分为False

values1 = [1, 2, 3, 4]
result = all(values1)
print(result)  # 输出: True

values2 = [1, 2, 0, 4]
result = all(values2)

print(result)  # 输出: False

values1 列表中的所有元素都被认为是 True(因为所有元素都不是 0FalseNone)。因此,all() 返回 True

values2 列表中包含 0,它被视为 False,因此 all() 返回 False,即使列表中其他元素为 True

示例 3:空的可迭代对象

values = []
result = all(values)

print(result)  # 输出: True

对于空的可迭代对象,all() 返回 True,因为没有元素来违反所有元素为 True 的条件。

示例 4:与生成器表达式结合使用

all() 可以与生成器表达式结合,检查某些条件是否对所有元素都成立。例如,检查一个列表中的数字是否都大于 10。

numbers = [11, 12, 15, 20]
result = all(num > 10 for num in numbers)

print(result)  # 输出: True

上面的代码,通过生成器表达式检查所有数字是否大于 10。因为列表中的每个数字都大于 10,all() 返回 True

示例 5:与条件结合使用
all() 可以用于检查某些条件是否对所有元素成立。例如,检查字符串列表中的所有字符串是否为非空字符串。

strings = ["hello", "world", "python"]
result = all(s != "" for s in strings)

print(result)  # 输出: True

通过all() 检查列表中的所有字符串是否非空。因为所有字符串都非空,所以返回 True

示例 6:非布尔值元素
all() 会对可迭代对象中的每个元素进行布尔值转换。比如,0FalseNone,空字符串等都会被视为 False,其余的则视为 True

values = [1, True, "Non-empty string", [1, 2]]
result = all(values)

print(result)  # 输出: True

列表中的所有元素都被视为 True1True,非空字符串,非空列表),因此 all() 返回 True

性能

  • all() 会在遍历过程中检查每个元素的布尔值,直到找到一个 False 元素。如果找到,便立即返回 False,从而避免了对后续元素的检查。
  • 对于空的可迭代对象,all() 始终返回 True,因为空集合没有元素违反条件。

any 与 all 的对比

  • any()all() 都是用于检查可迭代对象的布尔值。any() 检查是否有至少一个元素为 True,而 all() 检查是否所有元素都为 True
values = [0, 1, 2]
print(any(values))  # 输出: True
print(all(values))  # 输出: False

zip

zip() 用于将多个可迭代对象(如列表、元组等)中的元素逐一配对,返回一个 迭代器,它生成的是 元组。这些元组由对应位置的元素组成,形成一个新的可迭代对象。

语法:

zip(*iterables)
  • iterables:一个或多个可迭代对象(如列表、元组、字符串等)。可以传入任意数量的可迭代对象。
  • *:表示将所有传入的可迭代对象拆开。

返回值:

  • zip() 返回一个 zip 对象,这是一个迭代器,每次迭代会返回一个元组,元组的每个元素来自对应可迭代对象的相同位置。
  • zip() 返回的迭代器在遍历时会生成元组,但它本身并不存储这些元组,只有在实际迭代时才会生成它们。

特点:

  1. 配对元素:它将多个可迭代对象中的元素按顺序配对,创建元组。
  2. 最短长度的可迭代对象为准:如果传入多个可迭代对象,它会根据最短的可迭代对象来停止配对。也就是说,结果的长度等于最短输入可迭代对象的长度。
  3. 返回迭代器zip() 返回的是一个迭代器,如果想查看结果,需要将其转换为列表、元组或其他可迭代对象。

示例:

示例 1:配对多个列表

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = ['x', 'y', 'z']
result = zip(list1, list2, list3)

# 打印结果
print(list(result))  # 输出: [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]

zip() 将三个列表中的元素按位置配对,形成包含三元素元组的迭代器,输出 [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]

示例 2:不同长度的可迭代对象

list1 = [1, 2, 3]
list2 = ['a', 'b']
result = zip(list1, list2)

# 打印结果
print(list(result))  # 输出: [(1, 'a'), (2, 'b')]

map()的匹配规则类似,zip() 根据最短的列表 list2 来停止配对。即使 list1 有更多的元素,zip() 只会配对到 list2 的元素为止。因此,结果是 [(1, 'a'), (2, 'b')]

示例 3:将 zip() 结果转换回原来的列表
我们可以使用 zip() 函数来反向解压原有的元组。利用 * 操作符可以将 zip 对象解压回原来的多个列表。

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
zipped = zip(list1, list2)

# 使用 * 操作符解压
unzipped = zip(*zipped)
list1, list2 = list(unzipped)
print(list1)  # 输出: [1, 2, 3]
print(list2)  # 输出: ['a', 'b', 'c']

在这个例子中,我们先使用 zip() 将两个列表配对,然后再使用 zip(*zipped) 将它们解压回原来的两个列表。

示例 4:与字典结合使用
zip() 也可以与字典一起使用,来构建字典。通过 zip() 创建的元组可以用作字典的键值对。

keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']
result = dict(zip(keys, values))

print(result)  # 输出: {'name': 'Alice', 'age': 25, 'city': 'New York'}

在这个例子中,zip()keysvalues 列表中的元素配对,然后 dict() 将配对的元组转换成字典。

常见用途:

  1. 配对元素:可以方便地将两个或多个可迭代对象中的元素按位置配对,用于并行处理多个序列。
  2. 解压序列:可以通过 * 运算符将 zip 生成的元组解压,恢复原始的多个序列。
  3. 字典生成:可以将两个序列(例如一个键列表和一个值列表)通过 zip() 组合成字典。

性能

  • zip() 产生的是一个 迭代器,而不是一个完整的列表或元组。只有在实际迭代时,它才会生成每个元组。
  • 这种按需生成的特性使得 zip() 在处理大量数据时更加高效,因为它不会一次性创建整个结果,而是会逐步产生需要的结果。

enumerate

enumerate() 用于将一个可迭代对象(如列表、元组或字符串)组合成一个 索引-元素 对的迭代器(哈希)。它常用于在循环中同时获取元素的索引和值,使得代码更加简洁和易读。

语法:

enumerate(iterable, start=0)
  • iterable:一个可迭代对象(如列表、元组、字符串等),即想要进行枚举的对象。
  • start(可选):指定索引的起始值,默认为 0。可以根据需要设置不同的起始索引值。

返回值:

  • enumerate() 返回一个 enumerate 对象,它是一个迭代器,每次迭代返回一个元组。这个元组包含两个元素:
    1. 索引(从 start 开始)
    2. 可迭代对象中的元素

特点:

  1. 索引和值的配对enumerate() 同时提供元素及其索引。
  2. 支持起始索引值的设置:通过 start 参数可以指定索引从哪个数字开始,默认为 0
  3. 返回的是迭代器enumerate() 返回的是一个迭代器,需要通过 for 循环或 list() 等方式进行遍历和转换。

示例:

示例 1:遍历列表,获取元素的索引和值

fruits = ['apple', 'banana', 'cherry']

for index, fruit in enumerate(fruits):
    print(f"索引: {index}, 元素: {fruit}")
# 可以通过设定start关键字,指定索引的起始值:
for index, fruit in enumerate(fruits, start=1):
	# 此时print,索引从1开始

输出

索引: 0, 元素: apple
索引: 1, 元素: banana
索引: 2, 元素: cherry

在这个例子中,enumerate() 遍历列表 fruits,并为每个元素返回它的索引和值。可以通过 start=n 设置起始的索引值为 n

示例 2:将 enumerate() 结果转换为列表

fruits = ['apple', 'banana', 'cherry']
enumerated_fruits = list(enumerate(fruits))
print(enumerated_fruits)

输出

[(0, 'apple'), (1, 'banana'), (2, 'cherry')]

在这个例子中,enumerate() 返回一个迭代器,它被转换为列表并打印出来。结果是一个包含元组的列表,每个元组包含元素的索引和该元素。

示例 3:使用 enumerate() 在遍历时修改元素

fruits = ['apple', 'banana', 'cherry']

for index, fruit in enumerate(fruits):
    if fruit == 'banana':
        fruits[index] = 'orange'

print(fruits)

输出

['apple', 'orange', 'cherry']

在这个例子中,我们通过 enumerate() 获取元素的索引,然后在遍历过程中修改列表中的元素。

常见用途:

  1. 同时获取索引和值:最常见的用途是在循环中同时获得元素的索引和值,避免使用 range() 函数和手动索引的麻烦。
  2. 更简洁的代码:通过 enumerate() 可以使代码更简洁,无需手动维护一个索引变量。
  3. 在修改可迭代对象时:可以在循环中获取索引并使用它来修改可变对象(如列表)。

性能

  • enumerate() 本身是一个生成器,它返回的是一个迭代器,在遍历时才会生成每个索引和值的元组。因此,它比直接创建一个列表要更加节省内存,适用于处理大型数据集。

reverse

reversed() 用于返回一个可迭代对象的反向迭代器。该函数不改变原始对象,而是返回一个新的迭代器,可以按反向顺序访问原始可迭代对象的元素。

语法:

reversed(iterable)
  • iterable:任何支持迭代的对象,如列表、元组、字符串、集合、字典等。

返回值:

  • reversed() 返回一个 反向迭代器,可以通过 for 循环等方式进行遍历。需要注意的是,返回的对象是一个迭代器,而不是列表或其他数据类型。

特点:

  1. 不修改原对象reversed() 只返回一个反向的迭代器,原始的可迭代对象本身并不会被修改。
  2. 只能用于可迭代对象reversed() 适用于所有可迭代对象(如列表、元组、字符串等),但不能用于普通的数字或其他不可迭代对象。
  3. 返回的是迭代器:返回的反向迭代器可以按反向顺序访问元素,但如果想要获取一个反向列表或元组等数据类型,需要显式转换。
  4. 效率高reversed() 采用惰性求值,即它不会立即创建一个完整的反向列表,而是生成一个迭代器,在需要时逐个返回元素。

示例:

示例 1:反转列表 / 字符串 / 元组

numbers = [1, 2, 3, 4, 5] # 列表
reversed_numbers = reversed(numbers)
word = "hello" # 字符串
reversed_word = reversed(word)
tup = (10, 20, 30, 40, 50) # 元组
reversed_tup = reversed(tup)

# 使用for循环遍历反向迭代器
for num in reversed_numbers:
    print(num)
# 将反向迭代器转换为字符串并打印
print(''.join(reversed_word))
# 将反向迭代器转换为元组并打印
print(tuple(reversed_tup))

输出

5
4
3
2
1
olleh
(50, 40, 30, 20, 10)

示例 2:反转字典的键

my_dict = {'a': 1, 'b': 2, 'c': 3}
reversed_keys = reversed(list(my_dict.keys()))

# 使用for循环遍历反向键
for key in reversed_keys:
    print(key)

输出

c
b
a

由于字典本身是无序的(直到 Python 3.7),首先使用 list() 将字典的键转换为列表,然后对其进行反转。

转换为其他数据类型:
如果需要将反向迭代器转换为列表、元组等,可以直接使用 list()tuple() 等方法。

numbers = [1, 2, 3, 4]
reversed_list = list(reversed(numbers))
print(reversed_list)

输出

[4, 3, 2, 1]

注意:

  • reversed() 不能直接作用于字典,因为字典是一个无序的集合(直到 Python 3.7)。需要先提取字典的键或值,或转换为列表。
  • 对于一些不可变的数据类型,如字符串,reversed() 返回的是一个迭代器,如果需要得到一个新的字符串,则需要使用 ''.join() 或其他方法进行转换。

性能

  • reversed() 是一个惰性求值函数,即它不会立即创建一个完整的反向序列。它返回一个迭代器,每次迭代时按需生成反向元素,因此在处理大数据时效率较高。
  • 如果需要频繁访问反向数据,reversed() 会比手动创建一个新的列表(通过切片等方式)更加节省内存和计算时间。

sum

sum() 用于对可迭代对象(如列表、元组、集合等)中的元素进行求和操作。它可以接受一个可迭代对象并返回该对象中所有元素的总和。

语法:

sum(iterable, start=0)
  • iterable:一个可迭代对象,如列表、元组、集合、字典的值等。该对象中的元素应为数值类型(整数、浮点数等)。
  • start:这是一个可选参数,默认为 0。它指定了累加的起始值。在对 iterable 中的元素求和时,会将 start 加到最终的结果中。

返回值:
sum() 返回一个数值,表示可迭代对象中所有元素的和。如果提供了 start,那么返回值为 iterable 中元素的和加上 start

特点:

  1. 支持多种可迭代对象sum() 可以对列表、元组、集合、字典的值等可迭代对象求和。
  2. 支持指定起始值:可以通过 start 参数指定从哪个值开始累加。
  3. 只适用于数值类型sum() 只能用于数值类型(整数或浮点数)的元素。如果传入非数值类型,会抛出 TypeError

示例:

示例 1:求列表/元组等数据结构元素的和

# 求列表元素的和
_list = [1, 2, 3, 4, 5]
list_ret = sum(_list)
print(f"list_ret: {list_ret}")
# 求元组元素的和
_tuple = (10, 20, 30, 40)
tuple_ret = sum(_tuple)
print(f"tuple_ret: {tuple_ret}")
# 使用 start 参数
_list2 = [1, 2, 3, 4]
list_ret2 = sum(_list2, 10)  # 从10开始累加
print(f"list_ret2: {list_ret2}")
# 求集合元素的和
_set = {5, 10, 15, 20}
set_ret = sum(_set)
print(f"set_ret: {set_ret}")
# 如果列表为空,则求的结果为0
numbers = []
result = sum(numbers)
print(f:"result: {result}") # 0

输出

list_ret: 15
tuple_ret: 100
list_ret2: 20
set_ret: 50
result: 0

**示例 2:对字典的值求和 **

my_dict = {'a': 1, 'b': 2, 'c': 3}
result = sum(my_dict.values())
print(result)

输出

6

字典的 values() 方法返回字典的所有值,sum() 对这些值进行求和。

性能

  • 时间复杂度sum() 函数的时间复杂度是 O(n),其中 n 是可迭代对象中元素的个数。它需要遍历整个可迭代对象一次来进行求和。
  • 空间复杂度:由于 sum() 是原地计算的,不需要额外的存储空间,因此空间复杂度为 O(1)。

注意事项:

  1. 类型要求sum() 仅适用于数值类型(整数和浮点数),如果可迭代对象中包含非数值类型元素,会引发 TypeError 异常。

    numbers = [1, 2, '3', 4]
    result = sum(numbers)  # 会引发 TypeError
    
  2. 不适用于非数值类型的可迭代对象:如字符串、列表中有字符串元素时,直接使用 sum() 会导致错误。如果想对字符串列表进行连接,可以使用 ''.join()

  3. start 参数的类型start 参数的类型应与 iterable 中的元素类型匹配,否则也会抛出 TypeError


max / min

max()min() 分别用于获取可迭代对象中的最大值和最小值。它们也可以用于比较多个单独的元素并返回最大或最小的元素。

1. max() 函数

语法:

max(iterable, *, key=None, default=None)
max(arg1, arg2, *args, key=None)
  • iterable:一个可迭代对象(如列表、元组、集合等),用于查找其中的最大值。
  • key:一个可选的函数,用于指定对元素进行排序的方式。key 函数会作用于每个元素,并返回用于比较的值。默认为 None,表示直接比较元素。
  • default:如果 iterable 为空且没有提供 default 参数,会抛出 ValueError。如果提供了 default,则返回 default 值,防止空迭代对象时报错。

另外,max() 还可以接收多个参数而不是可迭代对象,用于返回一组单独值中的最大值。

示例:
  1. 从列表中找最大值

    numbers = [1, 2, 3, 4, 5]
    result = max(numbers)
    print(result)
    

    输出

    5
    

    max() 返回列表中最大值 5

  2. 使用 key 参数

    words = ["apple", "banana", "cherry", "date"]
    result = max(words, key=len)  # 根据字符串长度找最大值
    print(result)
    

    输出

    banana
    

    max() 返回字符串长度最大的词 banana,因为 len("banana") 最大。

  3. 多个参数求最大值

    result = max(1, 5, 2, 7, 3)
    print(result)
    

    输出

    7
    

    max() 直接比较传入的多个值,返回最大的 7

  4. 空列表提供 default 参数

    numbers = []
    result = max(numbers, default=0)
    print(result)
    

    输出

    0
    

    由于列表为空,返回 default 参数值 0


2. min() 函数

语法:

min(iterable, *, key=None, default=None)
min(arg1, arg2, *args, key=None)
  • iterable:一个可迭代对象,用于查找其中的最小值。
  • key:一个可选的函数,用于指定对元素进行排序的方式,类似 max() 中的 key 参数。默认为 None
  • default:如果 iterable 为空且没有提供 default 参数,会抛出 ValueError。如果提供了 default,则返回 default 值。

min() 也可以接收多个参数并返回这些值中的最小值。

示例:
  1. 从列表中找最小值

    numbers = [1, 2, 3, 4, 5]
    result = min(numbers)
    print(result)
    

    输出

    1
    

    min() 返回列表中最小值 1

  2. 使用 key 参数

    words = ["apple", "banana", "cherry", "date"]
    result = min(words, key=len)  # 根据字符串长度找最小值
    print(result)
    

    输出

    apple
    

    min() 返回字符串长度最小的词 apple

  3. 多个参数求最小值

    result = min(1, 5, 2, 7, 3)
    print(result)
    

    输出

    1
    

    min() 直接比较传入的多个值,返回最小的 1

  4. 空列表提供 default 参数

    numbers = []
    result = min(numbers, default=0)
    print(result)
    

    输出

    0
    

    由于列表为空,返回 default 参数值 0


3. max()min() 的共同特性

  • 都可以处理可迭代对象:两者都可以对列表、元组、集合等可迭代对象中的元素进行比较,并返回最大值或最小值。
  • 都可以使用 key 参数:可以通过 key 参数提供一个函数来定制比较的规则。例如,可以通过 key=len 来比较字符串的长度,而不仅仅是字面值。
  • 都可以处理多个单独的参数:除可迭代对象外,max()min() 还支持将多个元素作为单独的参数传入进行比较。
  • 空迭代对象时提供 default 参数:如果传入的可迭代对象为空且没有指定 default,两者都会抛出 ValueError 异常。但如果指定了 default 参数,则返回该值。

性能

  • 时间复杂度max()min() 的时间复杂度都是 O(n),其中 n 是可迭代对象中元素的数量。因为它们需要遍历整个可迭代对象一次来找到最大或最小值。
  • 空间复杂度:这两个函数都是原地操作的,因此它们的空间复杂度是 O(1)。

4. 注意事项

  • 空迭代对象:如果没有提供 default 参数并且传入的是空的可迭代对象,max()min() 都会抛出 ValueError
  • 可比性max()min() 依赖于元素之间的比较运算符(<> 等)。如果迭代对象中的元素不可比较(例如,包含不同类型的元素),会引发 TypeError

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥云客--浓缩咖啡液

4.浓缩咖啡液【算法赛】 - 蓝桥云课 问题描述 蓝桥杯备赛选手小蓝最近刷题刷到犯困&#xff0c;决定靠咖啡续命。他手上有 N 种浓缩咖啡液&#xff0c;浓度分别是 A1​%, A2​%, …, AN​%&#xff0c;每种存货都是无限的。为了提神又不炸脑&#xff0c;小蓝需要按比例混合这…

SQLark(百灵连接):一款面向信创应用开发者的数据库开发和管理工具

SQLark&#xff08;百灵连接&#xff09;是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统。 目前可以支持达梦数据库、Oracle 以及 MySQL。 SQL 智能编辑器 基于语法语义解析实现代码补全能力&#xff0c;为你提供…

计算机视觉——为什么 mAP 是目标检测的黄金标准

概述 在目标检测领域&#xff0c;有一个指标被广泛认为是衡量模型性能的“黄金标准”&#xff0c;它就是 mAP&#xff08;Mean Average Precision&#xff0c;平均精确率均值&#xff09;。如果你曾经接触过目标检测模型&#xff08;如 YOLO、Faster R-CNN 或 SSD&#xff09;…

Frame Of Reference压缩算法

文章目录 1_概述2_算法基本步骤3_过程优化4_优势以及局限5_模拟实现6_总结 1_概述 Frame of Reference&#xff08;FoR&#xff09;压缩算法 是一种用于压缩数值数据的算法&#xff0c;特别是在处理大规模数据集时&#xff0c;利用数据的局部性和重复性来减少存储和传输的开销…

esp32cam 开发板搭载ov3660摄像头在arduino中调用kimi进行图像识别

首先呢,最近搞一个项目,需要一个摄像头拍摄图片 就买了个ov3660开发板,用的esp32S芯片 淘宝商家给的教程是arduino的,所以先用arduino跑起来 arduino配置esp32-cam开发环境 - 简书1、安装arduino https://www.arduino.cc/en/Main/Software?setlang=cn 2、配置esp32 打开…

二十种中药果实识别分类系统,Python/resnet18/pytorch

二十种中药果实识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 20类中药材具体包括&#xff1a;(1) 补骨脂&#xff0c;(2) 草豆蔻&#xff0c;(3) 川楝子&#xff0c;(4) 地肤子&…

如何实现两个视频融合EasyCVR平台的数据同步?详细步骤指南

有用户咨询&#xff0c;现场需要数据库同步&#xff0c;如何将两个EasyCVR平台的数据进行同步呢&#xff1f; 这篇文章我们将详细介绍如何通过简单的接口调用&#xff0c;高效完成两个平台的数据同步操作。 1&#xff09;获取token 使用Postman调用登录接口&#xff0c;获取…

WindowsPE文件格式入门05.PE加载器LoadPE

https://bpsend.net/thread-316-1-1.html LoadPE - pe 加载器 壳的前身 如果想访问一个程序运行起来的内存,一种方法就是跨进程读写内存,但是跨进程读写内存需要来回调用api,不如直接访问地址来得方便,那么如果我们需要直接访问地址,该怎么做呢?.需要把dll注进程,注进去的代码…

使用Cusor 生成 Figma UI 设计稿

一、开发环境 系统&#xff1a;MacOS 软件版本&#xff1a; Figma&#xff08;网页或APP版&#xff09; 注&#xff1a;最好是app版&#xff0c;网页版figma 没有选项 import from manifest app下载地址&#xff1a;Figma Downloads | Web Design App for Desktops & …

Golang的文件同步与备份

Golang的文件同步与备份 一、Golang介绍 也称为Go语言&#xff0c;是谷歌开发的一种编程语言&#xff0c;具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库&#xff0c;Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…

如何用人工智能大模型,进行作业批改?

今天我们学习人工智能大模型如何进行作业批改。手把手学习视频请访问https://edu.csdn.net/learn/40402/666452 第一步&#xff0c;进入讯飞星火。打开google浏览器&#xff0c;输入百度地址后&#xff0c;搜索”讯飞星火”&#xff0c;在搜索的结果中&#xff0c;点第一个讯飞…

MATLAB之数据分析图系列 三

三维堆叠柱状图 Bar3StackPlot.m文件 clc; clear; close all; %三维堆叠柱状图 %% 数据准备 % 读取数据 load data.mat % 初始化 dataset X; s 0.4; % 柱子宽度 n size(dataset,3); % 堆叠组数%% 图片尺寸设置&#xff08;单位&#xff1a;厘米&#xff09; figureUnits c…

python爬虫:DrissionPage实战教程

如果本文章看不懂可以看看上一篇文章&#xff0c;加强自己的基础&#xff1a;爬虫自动化工具&#xff1a;DrissionPage-CSDN博客 案例解析&#xff1a; 前提&#xff1a;我们以ChromiumPage为主&#xff0c;写代码工具使用Pycharm&#xff08;python环境3.9-3.10&#xff09; …

一、STM32简介

一、实验器材介绍 二、STM32简介 1.STM32 名词解释 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。 ST&#xff0c;指ST公司&#xff08;意法半导体&#xff09;;M&#xff0c;MicroController 微控制器&#xff08;MCU,MicroController Unit 微控制器单元/单片机&…

[ctfshow web入门] web2

前置知识 js是可以写在网页中&#xff0c;用于控制网页行为&#xff0c;例如现在表现出无法使用F12&#xff0c;常见用法校验前台登录时输入的邮箱格式是否正确 ‌view-source‌协议是一种早期就存在的协议&#xff0c;基本上所有主流浏览器都支持这一协议&#xff0c;因此用户…

PyQt5和OpenCV车牌识别系统

有需要请加文章底部Q哦 可远程调试 PyQt5和OpenCV车牌识别系统 一 介绍 此车牌识别系统基于PyQt5和OpenCV开发&#xff0c;蓝牌&#xff0c;新能源(绿牌)&#xff0c;黄牌&#xff0c;白牌均可以准确识别&#xff0c;支持中文识别&#xff0c;可以导出识别结果(Excel格式)。此…

【Android Studio 下载 Gradle 失败】

路虽远行则将至&#xff0c;事虽难做则必成 一、事故现场 下载Gradle下载不下来&#xff0c;没有Gradle就无法把项目编译为Android应用。 二、问题分析 观察发现下载时长三分钟&#xff0c;进度条半天没动&#xff0c;说明这个是国外的东西&#xff0c;被墙住了&#xff0c;需…

Xshell Plus 6下载与安装

文章目录 Xshell Plus 6 简介&#xff08;一&#xff09;网络连接与协议支持&#xff08;二&#xff09;会话管理&#xff08;三&#xff09;安全特性&#xff08;四&#xff09;文件传输功能&#xff08;因集成Xftp 6 &#xff09;&#xff08;五&#xff09;个性化与便捷功能…

九、重学C++—类和函数

上一章节&#xff1a; 八、重学C—动态多态&#xff08;运行期&#xff09;-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147004745?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp/cppClassAndFunc.cpp CuiQingCheng/cppstudy - 码云 - 开源中国…

使用MCP服务器实现AI任务完成通知:让Cursor更智能

0. 简介 在使用AI工具进行长时间任务时&#xff0c;常常需要等待结果。MCP&#xff08;Model Context Protocol&#xff09;服务器"mcp_server_notify"提供了一个优雅的解决方案&#xff0c;让AI在完成任务后通过系统通知提醒你。本文将介绍如何在Cursor中配置和使用…