Транспонирование и заполнение списка Python

У меня список списков такой, что длина каждого внутреннего списка равна либо 1, либо n (предположим, что n > 1).

>>> uneven = [[1], [47, 17, 2, 3], [3], [12, 5, 75, 33]]

Я хочу транспонировать список, но вместо того, чтобы усекать более длинный список (как в случае с zip) или заполнять более короткие списки с помощью None, я хочу заполнять более короткие списки с помощью их собственное единственное значение. Другими словами, я хотел бы получить:

>>> [(1, 47, 3, 12), (1, 17, 3, 5), (1, 2, 3, 75), (1, 3, 3, 33)]

Я могу сделать это за пару итераций:

>>> maxlist = len(max(*uneven, key=len))
>>> maxlist
4
>>> from itertools import repeat
>>> uneven2 = [x if len(x) == maxlist else repeat(x[0], maxlist) for x in uneven]
>>> uneven2
[[1, 1, 1, 1], [47, 17, 2, 3], [3, 3, 3, 3], [12, 5, 75, 33]]
>>> zip(*uneven2)
[(1, 47, 3, 12), (1, 17, 3, 5), (1, 2, 3, 75), (1, 3, 3, 33)]

Но есть ли лучший подход? Мне действительно нужно знать maxlistзаранее, чтобы выполнить это?

10
задан kojiro 16 May 2012 в 00:15
поделиться