用Python内置的zip函数来实现。这个函数能把两个或更多的iterator封装成惰性生成器(lazy generator)。每次循环时,它会分别从这些迭代器里获取各自的下一个元素,并把这些值放在一个元组里面。

names = ["Cecilia", "Lise", "Marie"]
counts = [len(n) for n in names]


max_count = 0
for name, count in zip(names, counts):
    if count > max_count:
        longest_name = name
        max_count = count

print(longest_name)

当iterator长度不一致时,最短的遍历完不再遍历,原理:只要其中任何一个迭代器处理完毕,它就不再往下走了。

names = ["Cecilia", "Lise", "Marie"]
counts = [len(n) for n in names]


max_count = 0
names.append("Rosalind")
for name, count in zip(names, counts):
    if count > max_count:
        longest_name = name
        max_count = count

print(longest_name)  # 输出Cecilia

长度不一致时如何处理呢?zip_longest

import itertools


names = ["Cecilia", "Lise", "Marie"]
counts = [len(n) for n in names]


max_count = 0
names.append("Rosalind")
for name, count in itertools.zip_longest(names, counts):
    if count > max_count:
        longest_name = name
        max_count = count

print(longest_name)  
"""
输出:TypeError:
'>' not supported between instances of 'NoneType' and 'int'
原因:zip_longest按最长的遍历,其他长度不足的列表会以None代替
"""

是否可不用None,用特定的值?fillvalue

import itertools


names = ["Cecilia", "Lise", "Marie"]
counts = [len(n) for n in names]


max_count = 0
names.append("Rosalind")
for name, count in itertools.zip_longest(names, counts, fillvalue=0):
if count > max_count:
longest_name = name
max_count = count

print(longest_name)