zip_longest для массива со списками одинаковой длины. Понимание

У меня есть массив, который содержит несколько списков одинаковой длины. Все эти списки нужно записать в .csv-файл. Используя фрагмент кода, я обнаружил, что он работает очень хорошо. Вот код:

ag=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

export_data = zip_longest(*ag, fillvalue = '') 

with open('motion_profile.csv', 'w', encoding="ISO-8859-1", newline='') as myfile:
    wr = csv.writer(myfile, delimiter=',')
    wr.writerow(("m","ax","ay","az","sx","sy","sz"))
    wr.writerows(export_data)  
myfile.close()

Я понимаю основную концепцию zip и zip_longest, когда у меня есть два массива, на которых я их использую. Но я просто не могу понять, что он делает с одним массивом, как здесь export_data = zip_longest(*ag, fillvalue = '')

Что именно произойдет с ag, если я использую на нем zip или zip_longest?

Поскольку у меня нет двух массивов, с чем это связано?

zip_longest применяется к каждому списку в ag, следовательно, *. Вот как далеко я продвинулся в этом.

Кто-нибудь может провести меня через это?


person McMo    schedule 22.03.2018    source источник


Ответы (1)


zip() не обязательно принимает два массива; он принимает произвольное количество массивов (итерируемых объектов) в качестве позиционных аргументов.

Делая это маленькими шагами,

  • *ag распаковывает вложенный список. Обратите внимание, что он распаковывает только «на один уровень вниз». Фактически у вас остается 4 списка, [1, 2, 3],... [10, 11, 12], как разрозненные элементы, которые станут позиционными аргументами.
  • Оттуда zip() ведет себя так, как ожидалось (вы передаете ему несколько распакованных списков).

Вы можете увидеть эквивалентность:

>>> i, j, k = zip(*ag)

>>> i
(1, 4, 7, 10)
>>> k
(3, 6, 9, 12)

>>> i2, j2, k2 = zip([1,2,3],[4,5,6],[7,8,9],[10,11,12])
                #     |_______|_______|________|
                #                 i2

>>> i2
(1, 4, 7, 10)
>>> k2
(3, 6, 9, 12)

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

С точки зрения синтаксиса вызова itertools.zip_longest(*iterables, fillvalue=None) очень похоже; у него просто есть один аргумент ключевого слова, добавленный в конец. Способ передачи подсписков фактически одинаков.

person Brad Solomon    schedule 22.03.2018