Как экспортировать все значения списков в CSV на Python - PullRequest
4 голосов
/ 22 апреля 2020
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 элементов, list_2 имеет 10 элементов и list_3 также есть 10 элементов,

, но когда я записываю списки в csv, столбцы list_2 и list_3 не показывают последние 2 элемента.

Ответы [ 2 ]

5 голосов
/ 22 апреля 2020

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

  • Сначала импортируйте его:
from itertools import zip_longest
  • Затем замените строку, которой вы назначаете cols с:
cols = zip_longest(list_1,list_2,list_3, fillvalue="")
2 голосов
/ 22 апреля 2020

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

Передача аргументов неравной длины При работе с 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 () или так ()). Если значение не указано, по умолчанию используется значение Нет.

Пример:

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, '_')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...