list_1 = ['1','2','3','4','5','6','7','8']
list_2 = ['n1','n2','n3','n4','n5','n6','n7','n8','n9','n10']
list_3 = ['o1','o2','o3','o4','o5','o6','o7','o8','o9','o10']

cols = zip(list_1,list_2,list_3)

with open('file.csv', 'w', newline='') as f:
    thewriter = csv.writer(f)

    thewriter.writerow(['list_1','list_2','list_3'])
    for col in cols:
       thewriter.writerow(col)

Выход

list1   list2   list3
  1      n1      o1
  2      n2      o2
  3      n3      o3
  4      n4      o4
  5      n5      o5
  6      n6      o6
  7      n7      o7
  8      n8      o8

Ожидаемый результат

list1   list2   list3
  1      n1      o1
  2      n2      o2
  3      n3      o3
  4      n4      o4
  5      n5      o5
  6      n6      o6
  7      n7      o7
  8      n8      o8
         n9      o9
         n10     o10 

У меня есть 3 списка, у list_1 есть 8 itens, у list_2 есть 10 itens, а у list_3 также есть 10 itens, но когда я записываю списки в csv, в столбце list_2 и list_3 не отображаются последние 2 itens.

4
Victor 22 Апр 2020 в 22:03

2 ответа

Лучший ответ

Это поведение по умолчанию zip: усечение до длины самой короткой итерации. Вместо этого вы можете использовать zip_longest:

  • Сначала импортируйте это:
from itertools import zip_longest
  • Затем замените строку, где вы назначаете cols:
cols = zip_longest(list_1,list_2,list_3, fillvalue="")
3
RMPR 22 Апр 2020 в 19:21

Вы можете увидеть эту ссылку и другую ссылка

Передача аргументов неравной длины Когда вы работаете с Функция Python zip(), важно обратить внимание на длину из ваших итераций. Возможно, что итерации, которые вы передаете как аргументы не имеют одинаковую длину.

В этих случаях количество элементов, которые zip() выпускает, будет равно длине самой короткой итерации . Остальные элементы в любых более длинных итерациях будет полностью игнорироваться zip()

В вашем случае вы получите его до 8-го значения (самый короткий список).

< Сильный > ИЗМЕНИТЬ

Вы можете использовать эту информацию itertools.zip_longest

Itertools.zip_longest (* iterables [, fillvalue])

Создайте итератор, который объединяет элементы из каждого итерируемого элемента. Если итерации имеют неравную длину, пропущенные значения заполняются значением заполнения. Итерация продолжается до тех пор, пока самая длинная итерация не будет исчерпана. Эквивалентно:

def zip_longest(*args, fillvalue=None):
     # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
     def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
         yield counter()         # yields the fillvalue, or raises IndexError
     fillers = repeat(fillvalue)
     iters = [chain(it, sentinel(), fillers) for it in args]
     try:
         for tup in zip(*iters):
            yield tup
     except IndexError:
         pass

Если одна из итераций потенциально бесконечна, то функция zip_longest () должна быть обернута чем-то, что ограничивает количество вызовов (например, islice () или takewhile ()). Если не указано, по умолчанию для параметра fillvalue установлено значение None.

Примере:

from itertools import zip_longest

l_1 = [1, 2, 3]
l_2 = [1, 2]

combinated = list(zip_longest(l_1, l_2, fillvalue="_"))

print(combinated)  # [(1, 1), (2, 2), (3, '_')]
1
Elbert Villarreal 22 Апр 2020 в 19:15