Кажется, что длина результирующего списка определяется длиной наименьшей строки в исходном списке. Если это действительно так, вы можете просто сделать это так:
X = ['kmo','catlin','mept']
l = len(min(X, key=len))
res = [[x[i] for x in X] for i in range(l)]
, что возвращает:
print(res) # -> [['k', 'c', 'm'], ['m', 'a', 'e'], ['o', 't', 'p']]
или еще проще (kudos @JonClemens):
res = [list(el) for el in zip(*X)]
с тем же результатом. Обратите внимание, что это работает, потому что zip
автоматически прекращает итерацию, как только один из его элементов истощается.
Если вы хотите заполнить пробелы так сказать, itertools
получил вашу спину с помощью zip_longest
метода. См. this для получения дополнительной информации. fillvalue
может быть чем угодно; здесь '-'
используется для демонстрации использования. Пустая строка ''
может быть лучшим вариантом для производственного кода .
res = list(zip_longest(*X, fillvalue = '-'))
print(res) # -> [('k', 'c', 'm'), ('m', 'a', 'e'), ('o', 't', 'p'), ('-', 'l', 't'), ('-', 'i', '-'), ('-', 'n', '-')]