Is there a zip-like function that pads to longest length?
Существует ли zip-подобная функция, которая дополняет до наибольшей длины?
Есть ли встроенная функция, которая работает как zip() но которая дополнит результаты так, чтобы длина результирующего списка была длиной самого длинного ввода, а не самого короткого ввода?
>>> a = ['a1'] >>> b = ['b1', 'b2', 'b3'] >>> c = ['c1', 'c2']
С Python 2 вы можете либо использовать itertools.izip_longest (Python 2.6+), либо вы можете использовать map с None. Это малоизвестная функция map (но map изменена в Python 3.x, так что это работает только в Python 2.x).
>>> map(None, a, b, c) [('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]
Ответ 2
Для Python 2.6x используйте itertools модуль izip_longest.
Для Python 3 используйте zip_longest вместо этого (без начала i).
В дополнение к принятому ответу, если вы работаете с итерациями, которые могут иметь разную длину, но не должны быть такими, рекомендуется передать strict=True в zip() (поддерживается с Python 3.10).
Процитирую документацию:
zip() часто используется в случаях, когда предполагается, что итерации имеют одинаковую длину. В таких случаях рекомендуется использовать strict=True опцию . Ее вывод такой же, как у обычного zip():
Без strict=True аргументов, либо ошибка что приводит к итерируемые объекты разной длины будут молчать, возможно, проявляющейся как трудно найти ошибку в другой части программы.
Ответ 4
решение на Python 3, отличное от itertools:
defzip_longest(*lists): defg(l): for item in l: yield item whileTrue: yieldNone gens = [g(l) for l in lists] for _ inrange(max(map(len, lists))): yieldtuple(next(g) for g in gens)