zip_longest 在具有相同长度列表的数组上。理解

zip_longest on Array with lists of the same length. Understanding

我有一个数组,其中包含一些长度相同的列表。所有这些列表都需要写在一个 .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()

当我有两个数组时,我理解 zipzip_longest 的基本概念。但是我只是无法理解它对像这里这样的单个数组所做的事情 export_data = zip_longest(*ag, fillvalue = '')

如果我在其上使用 zipzip_longestag 究竟会发生什么?

因为我没有两个数组,它压缩什么?

zip_longest 应用于 ag 中的每个列表,因此 *。这就是我得到的结果。

谁能帮我解决这个问题?

zip()不一定取两个数组;它需要任意数量的数组(可迭代)as positional arguments.

循序渐进,

  • *ag 解压嵌套列表。请注意,它只解压缩 "one level down." 你实际上剩下 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)

换句话说,这四个 sub-lists 作为四个位置参数传递给 zip()

在调用语法方面,itertools.zip_longest(*iterables, fillvalue=None)非常相似;它只有一个关键字参数附加到最后。 sub-lists 的传递方式实际上是相同的。