2016-01-21 97 views
0

我正在尝试编写一个将NumPy数组写入文件的函数。我想用Pythonic方法使用zip()。以下代码不起作用;我试图将命名参数(其中的值是1D NumPy数组,键是标签)**data_lists转换为zip函数所需的数组列表。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中的项目或以其他方式完成此项目?

回答

2

变化:

zip(data_lists[lst] for lst in data_lists) 

到:

zip(*data_lists.values()) 

解包的data_listsdict值放入顺序位置参数。 *被称为“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()调用),并获得一致的标题排序。

+0

很好的注意'.values()'方法。我之前并不知道这一点。 – duhamp

+1

@duhamp:如果你使用的是Python 2.7,那么你总是需要'.viewvalues()'来避免临时'列表'。在Py 3.x上,'.values()'是正确的。 '.values()'适用于Py2.7,这只是浪费。你也应该知道获取键/值对的'.items()'/'.viewitems()'。 '.keys()'/'.viewkeys()'也存在,但你通常不需要它(你可以直接迭代'dict'来获得键),除非你使用类似'set'的特性'dict'的意见。 – ShadowRanger