在我们使用python处理list、元组时,使用for循环进行遍历是常有的事情,当然有时候既需要获取元素的值,又要知道它的索引。这对于大部分送C、Java这类语言转过来的人来说,大概率会使用手动维护计数器,或者通过数组长度来循环。其实python中提供了更好的方案。今天我们就看看python中的enumerate()函数它的用法很简单,将列表传入函数,它会返回(索引,元素)的配对元组,然后我们直接在for语句中解包这两个值fruits = ["apple", "banana", "cherry"]# 同时获取索引和元素for i, fruit in enumerate(fruits): print(f"Index: {i}, Value: {fruit}")
Index: 0, Value: appleIndex: 1, Value: bananaIndex: 2, Value: cherry
Python的所以默认从0开始,很多时候我们希望它从1开始,那么只需要给enumerate()加一个start参数fruits = ["apple", "banana", "cherry"]# 索引从1开始计数for i, fruit in enumerate(fruits, start=1): print(f"Item {i}: {fruit}")
虽然enumerate是标准写法,但是在一些老代码中,带索引循环的实现,首先看一个range()+len()的组合,这样是经典的C语言风格,习惯问题:fruits = ["apple", "banana", "cherry"]for i in range(len(fruits)): print(f"Index: {i}, Value: {fruits[i]}")
每次循环都要通过fruits[i]索引访问元素,不仅阅读体验差,还更容易出现索引越界的错误。另外一种就是手动维护计数器
fruits = ["apple", "banana", "cherry"]i = 0for fruit in fruits: print(f"Index: {i}, Value: {fruit}") i += 1 # 手动自增计数器
在python中我们有了enumerate就可以尝试着替换这种原有的习惯了。enumerate()还能应对更复杂的循环场景,例如组合 zip (),如果想同时遍历两个或者多个列表,还想获取循环索引,只需要将enumerate和zip结合:
names = ["Tanaka", "Sato", "Suzuki"]ages = [25, 30, 28]# 同时遍历两个列表并获取索引for i, (name, age) in enumerate(zip(names, ages)): print(f"ID: {i}, Name: {name}, Age: {age}")
这里需要注意(name,age)是带了()的,它是显示解包zip()返回的元组。
我们还可以将enumerate()和字典的items()方法结合,实现带索引遍历字典,还能统计处理的键值对数量。
user_scores = {"Tanaka": 80, "Sato": 95, "Suzuki": 60}# 带索引遍历字典键值对for i, (name, score) in enumerate(user_scores.items()): print(f"User #{i+1}: {name} scored {score}")
总之,掌握enumerate()这一个函数,可以轻松搞定 Python 中所有带索引的循环场景,如果你还是习惯老套路,不妨试试它,相信你会喜欢上它的。