2016-01-21 63 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