Как заставить три списка иметь одинаковую длину в Python 3.7? - PullRequest
0 голосов
/ 16 июня 2020

Моя функция принимает в качестве аргументов три списка. Затем он использует PrettyTable для создания таблицы, в которой каждый список представляет собой отдельный столбец.

Моя проблема в том, что эти списки не всегда имеют одинаковую длину, и PrettyTable хочет, чтобы они были равными.

Интересно, как добавить несколько пустых позиций к двум более коротким спискам, чтобы они имели одинаковую длину.

В качестве альтернативы ... есть ли инструмент для создания таблиц, который не хочет, чтобы все столбцы были равными длина?

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Вы можете использовать эти функции:

def padlist(lst, size, defvalue=None):
    if len(lst) < size:
        lst.extend([defvalue] * (size - len(lst)))

def padlists(lsts, defvalue=None):
    size = max(len(lst) for lst in lsts)
    for lst in lsts:
        padlist(lst, size, defvalue)

# Demo
lsts = [
    ["a", "b", "c"],
    ["a", "b", "c", "d", "e"],
    ["a", "b"],
]

padlists(lsts, "")  # provide the value to pad with

print(lsts)  # shorter lists are padded with blanks
1 голос
/ 16 июня 2020

Вы можете использовать zip_longest.

from itertools import zip_longest

def pad(*lists, padding=None):
    padded = [[] for _ in lists]

    for lst in zip_longest(*lists, fillvalue=padding):
        for i, elem in enumerate(lst):
            padded[i].append(elem)

    return padded

test1 = [1, 2]
test2 = [1, 2, 3, 4]
test3 = [1, 2, 5, 8]

test1, test2, test3 = pad(test1, test2, test3)
print(test1, test2, test3)

Это работает с любым количеством списков. zip_longest объединяет переменное количество итераций в одну итерацию, дополненную до длины самой длинной итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...