enumerate()
的用法
enumerate()
是 Python 的一个内置函数,它允许你在遍历可迭代对象(如字符串、列表、元组等)时,同时获得元素的索引和元素的值。enumerate()
是在需要对迭代的数据进行索引操作时非常有用的工具。
语法:
enumerate(iterable, start=0)
iterable
: 要遍历的可迭代对象,比如字符串、列表、元组等。start
: 索引的起始值,默认是 0,可以自定义从某个数值开始。
返回值:
enumerate()
返回的是一个迭代器,每次迭代时返回一个元组,第一个元素是当前元素的索引,第二个元素是可迭代对象中的值。
示例:
- 基本用法:遍历字符串和获取索引
s = "hello"
for index, char in enumerate(s):print(index, char)
输出:
0 h
1 e
2 l
3 l
4 o
- 遍历列表并获得索引和元素
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):print(f"Index {index}: {fruit}")
输出:
Index 0: apple
Index 1: banana
Index 2: cherry
- 设置起始索引
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1):print(f"Index {index}: {fruit}")
输出:
Index 1: apple
Index 2: banana
Index 3: cherry
enumerate()
在 LeetCode 解题中的常用场景
在 LeetCode 解题中,enumerate()
非常常见,尤其是在需要同时处理元素及其索引的情况下。以下是几个典型的场景:
1. 在遍历数组时需要访问索引
很多问题涉及到数组或者字符串处理,我们不仅需要访问元素,还需要访问元素的索引。enumerate()
可以简化这类任务。
示例:查找元素及其索引
LeetCode 问题中可能要求你查找某个元素的索引,比如两数之和问题(Two Sum
):
def twoSum(nums, target):for i, num in enumerate(nums):complement = target - numif complement in nums[i+1:]:return [i, nums.index(complement, i+1)]
在上面的代码中,enumerate(nums)
被用来同时获得数组 nums
中的索引 i
和元素 num
。
2. 动态更新数组中的元素
在某些问题中,你可能需要遍历一个数组并根据索引修改或更新该数组中的元素。enumerate()
可以很方便地帮助我们找到元素及其位置,执行相关操作。
示例:从后向前遍历并修改元素
nums = [1, 2, 3, 4, 5]
for i, num in enumerate(nums):nums[i] = num * 2
这可以用于需要动态更新数组内容的问题,比如一些动态规划类问题。
3. 记录和对比前后元素
在滑动窗口类问题或比较当前元素与之前元素时,enumerate()
能帮助你轻松获取当前元素的索引,并与之前的元素进行比较。
示例:计算最大连续子数组和
LeetCode 常见的最大子数组和问题,使用 enumerate()
计算连续子数组的最大和。
def maxSubArray(nums):max_sum = float('-inf')current_sum = 0for i, num in enumerate(nums):current_sum = max(num, current_sum + num)max_sum = max(max_sum, current_sum)return max_sum
4. 处理多个相邻元素
有些问题要求我们处理相邻的元素(如找到符合条件的相邻对),enumerate()
可以很方便地给出当前元素的索引,方便与后续元素进行操作。
示例:找到相邻相同元素
def find_consecutive(s):for i, char in enumerate(s[:-1]): # 注意这里我们只遍历到倒数第二个字符if s[i] == s[i+1]:print(f"Consecutive characters at index {i} and {i+1}: {s[i]}")
5. 与哈希表结合使用
当我们需要存储元素的索引到哈希表(如字典)时,enumerate()
可以轻松地同时提供索引和元素。
示例:两数之和问题使用哈希表
def twoSum(nums, target):hash_map = {}for i, num in enumerate(nums):complement = target - numif complement in hash_map:return [hash_map[complement], i]hash_map[num] = i
在这段代码中,enumerate()
既提供了当前索引 i
,又提供了当前值 num
,这使得我们可以轻松地将元素及其索引存入哈希表中,并在后续查找时使用。
enumerate()
在 LeetCode 常见问题中的应用
- 滑动窗口类问题:当你需要动态更新子字符串或子数组的起始和结束位置时,
enumerate()
可以帮助你获取当前元素和索引,从而调整窗口的大小。 - 哈希表结合问题:如两数之和等问题,
enumerate()
可以快速为你提供索引和元素的对应关系,方便你在哈希表中进行查找。 - 动态规划类问题:
enumerate()
可以用来遍历状态数组,帮助我们轻松更新状态。
总结
enumerate()
是一种非常实用的工具,在遍历列表、字符串、数组等场景中经常用到,尤其是在需要同时处理元素及其索引的情况下。- 在 LeetCode 解题中,
enumerate()
常用于遍历数组并处理索引的场景,能够简化代码,避免手动管理索引变量。 - 常见的应用场景包括查找元素、更新数组、处理相邻元素、滑动窗口问题等。