标签:Python,enumerate函数,zip函数
本文将通过几个示例介绍Python中的enumerate()函数和zip()函数。
enumerate()函数返回迭代iterables(列表、字典、集等)中所有项的索引,而zip()函数用于聚合或组合多个迭代。
enumerate函数
Python中的enumerate()函数用于检索迭代中所有项的索引。迭代是Python中的项的集合,如列表、字典和集。
虽然可以使用index()函数获取迭代中某个项的索引,但index()函数只返回该项第一次出现的索引。例如,在下面脚本中的nums列表中,整数20出现三次。如果试图打印整数20的索引,将只看到第一次出现的20的索引,即索引位置2。
nums= [10,15,20,25,30,14,20,19,34,14,20,12]
index_20= nums.index(20)
print(index_20)
结果如下图1所示。
图1
使用enumerate()函数,可以获取所有项的索引,即使它们在列表中出现多次。enumerate()函数的作用是:返回“enumerate”类型的对象,如下面脚本的输出所示。
type_enum= type(enumerate(nums))
print(type_enum)
结果如下图2所示。
图2
enumerate()函数的作用是:返回两个项目的元组,其中第一个项目对应于索引,而第二个项目对应于相应迭代中的实际项目。可以将enumerate()函数返回的对象转换为包含索引和相应项的元组列表,如下所示:
print(list(enumerate(nums)))
输出结果如下图3所示。
图3
现在,可以看到nums列表中的所有索引及其对应项。注意,还可以看到多次出现的项的索引,例如整数20和14。
可以使用for循环遍历enumerate()函数返回的元组,如下面的代码所示,其中第一个元组项通过索引0访问,而第二个元组项通过索引1访问。
for i in enumerate(nums):
print("索引=>",i[0]," - 值 =>",i[1])
结果如下图4所示。
图4
还可以使用元组解包直接访问enumerate()函数返回的元组中的索引和项。下面是一个例子:
for i,j in enumerate(nums):
print("索引=>",i," - 值 =>",j)
结果如下图5所示。
图5
作为另一个示例,下面的脚本演示了如何使用enumerate()函数获取“nums”列表中整数20的所有索引。
for i in enumerate(nums):
if i[1] == 20:
print("值 =>",i[1]," - 索引 =>",i[0])
结果如下图6所示。
图6
还可以通过向start参数传递一个值来重置enumerate()返回的元组的起始索引。例如,下面的脚本将8设置为enumerate()函数返回的元组列表的起始索引值。
for i in enumerate(nums, start = 8):
print("索引=>",i[0], " - 值 =>", i[1])
结果如下图7所示。
图7
zip函数
Python中的zip()函数用于聚合多个迭代。zip函数的作用是:返回一个元组列表,其中每个元组包含来自原始迭代的匹配索引的项。
下面的脚本包含三个列表:names、ages和genders,每个列表有5项。这些列表通过zip()函数聚合。如果打印zip()函数返回的元组列表,将看到每个元组项都包含来自原始列表中匹配索引的项。例如,第一个元组包含三个项:“john”,20,“male”。这三项分别出现在names、ages和genders列表的第0个索引中。
names= ["john", "nick", "sally","Elizabeth", "Mike"]
ages= [20, 25, 35, 22, 29]
genders= ["male", "male", "female", "female","male"]
records= list(zip(names, ages, genders))
print(records)
结果如下图8所示。
图8
正如在enumerate()函数中看到的那样,可以使用元组解包从zip()函数返回的元组中获取单个项。下面是一个例子:
for name, age, gender in zip(names, ages, genders):
print("姓名=>",name, " - 年龄=>", age, " -性别=>",gender)
结果如下图9所示。
图9
在某些情况下,使用zip()函数聚合或组合的迭代包含数量不等的项。在这种情况下,只有来自多个迭代的项与最小迭代中的项相对应,才会进行聚合。
例如,在下面的脚本中,genders列表只包含2项。在以下情况下,使用zip()函数聚合names、ages和genders列表将只返回两个元组,其中包含names、ages和genders列表的第0个和第1个索引中的项。
names= ["john", "nick", "sally","Elizabeth", "Mike"]
ages= [20, 25, 35, 22, 29]
genders= ["male", "male"]
records= list(zip(names, ages, genders))
print(records)
结果如下图10所示。
图10
enumerate与zip组合
还可以对zip()函数返回的输出调用enumerate()函数。在这种情况下,enumerate()函数将返回元组,其中元组中第一个索引处的项将对应于zip()函数返回的元组的索引,第二个索引处的项将对应于zip()函数返回的实际元组。下面是一个示例。
names= ["john", "nick", "sally", "Elizabeth","Mike"]
ages= [20, 25, 35, 22, 29]
genders= ["male", "male", "female", "female","male"]
for i, record in enumerate(zip(names, ages, genders)):
print("索引=>",i, " -姓名=>", record[0], " -年龄=>",record[1], " -性别=>", record[2])
结果如下图11所示。
图11
注意,现在有一个列表的表,其中包含一个关联的索引。
注:本文学习整理自wellsr.com,供有兴趣的朋友参考。