Zip()已经初始化列表

时间:2016-01-21 01:25:11

标签: python numpy

我试图编写一个将NumPy数组写入文件的函数。我想使用Pythonic方法使用zip()。以下代码不起作用;我试图将**data_lists命名参数(其值为1D NumPy数组,键只是标签)转换为zip函数所需的数组列表。

def write_data_file(filename,**data_lists):
    with open("{}.dat".format(filename), "w") as f:
        header = "#"        
        for lst in data_lists:
            header = "{} {} \t".format(header,lst)
        header = "{} \n".format(header)
        f.write(header)
        # The following line of code does not work
        for row in zip(data_lists[lst] for lst in data_lists): 
            f.write("\t".join([str(item) for item in row])+ "\n")

我无法首先分配到列表,如下所示:

trial = [data_lists[lst] for lst in data_lists]
zip(trial) 

这没有任何作用,因为试验被视为单个参数。如何zip()单独处理trial中的项目或以其他方式完成此项目?

1 个答案:

答案 0 :(得分:2)

变化:

zip(data_lists[lst] for lst in data_lists)

为:

zip(*data_lists.values())

data_lists dict的值解压缩为顺序位置参数。 *被称为“splat”或可迭代的解包操作符。

虽然values的顺序没有定义,但有点奇怪;你根据Python版本以不同的顺序zip(在一个版本中,你经常zip以不同的顺序从运行到运行)。您正在使用迭代顺序来定义标头,因此列每次都会匹配标头,但列的顺序会因运行而不同。您可能希望尝试将标题作为单独的参数接收,然后是位置上的值,例如:

def write_data_file(filename, headers, *data_lists):
    if len(headers) != len(data_lists): ... raise Exception for mismatched lengths ...

然后你只是做zip(*data_lists)(没有.values()调用),并获得一致的标题排序。