我试图编写一个将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
中的项目或以其他方式完成此项目?
答案 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()
调用),并获得一致的标题排序。