我有一個列表的列表,使每個內部列表的長度是1或n(假設n> 1)。Python列表轉置和填充
>>> 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
才能完成此任務嗎?
你可以模擬'itertools.izip_longest',只是使用序列代替'fillvalue'的最後一個值時,該序列被耗盡。 –
@ChrisMorgan是正確的看到這個鏈接http://docs.python.org/library/itertools.html也許你也可以使用其他一些功能。 –