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

时间:2018-03-22 15:51:23

标签: python python-3.x itertools splat

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

ag如果我使用zipzip_longest会发生什么?

因为我没有两个阵列,所以它会拉链?

zip_longest正在应用于ag中的每个列表,因此*。那是我走了多远。

有人能指引我吗?

1 个答案:

答案 0 :(得分:2)

zip()不一定需要两个数组;它需要任意数量的数组(iterables)as positional arguments

以较小的步骤执行此操作,

  • *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)非常相似;它只有一个关键字参数被添加到最后。子列表的传递方式实际上是相同的。