2017-04-14 49 views
2

元組的列表哪有Python字典,看起來像這樣:蟒蛇字典,以CSV

{ 
    'RCLS1': [(0, 20), (10, 112), (20, 130), (30, 102)], 
    'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)] 
} 

轉換爲CSV具有結構:

RCLS1, 0, 20 
RCLS1, 10, 112 
. 
. 
. 
RLCS2, 30, 45 

我已經試過這樣:

with open(r'E:\data.csv', "wb") as f: 
    csv.writer(f).writerows((k,) + v for k, v in dct.items()) 

但這會導致以下錯誤:

can only concatenate tuple (not "list") to tuple 
+2

什麼是你希望輸出的樣子。目前'v'是一個元組列表,所以'(k,)+ v'試圖將一個元組添加到它不能做的元組列表中。 – AChampion

+2

@AChampion表示同意。你能提供一個預期產出的例子嗎? – PrestonM

+0

感謝您的意見。同意,我對預期產出的解釋寫得不好。現在包括一個例子。 – JacamoFinane

回答

1

根據您提供的示例輸入/輸出,您可以遍歷字典的鍵值對,然後遍歷與每個鍵關聯的元組值列表,遍歷與每個鍵關聯的元組值列表,並將其寫入CSV文件,像這樣:

dct = {'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]} 
int_to_str = lambda int_value: str(int_value) 

with open(r"data.csv", "w") as csv_file: 
    for key, values in dct.items(): 
     for tuple_value in values: 
      csv_row = [key] + list(map(int_to_str, list(tuple_value))) 
      csv_file.write(", ".join(csv_row) + "\n") 

data.csv結果:

RCLS2, 0, 16 
RCLS2, 10, 53 
RCLS2, 20, 96 
RCLS2, 30, 45 
RCLS1, 0, 20 
RCLS1, 10, 112 
RCLS1, 20, 130 
RCLS1, 30, 102 
+0

謝謝你的想法。我編輯了這個問題來澄清輸出。我之前並不清楚。我很抱歉。如果你可以請再看一眼,分享你的想法。非常感謝你。 – JacamoFinane

+1

@JacamoFinane不用客氣。你能嘗試更新的答案嗎? –

+0

這看起來不錯,@羅伯特瓦倫西亞,謝謝你給我展示了一種有效的方法來達到理想的輸出。感謝您的指導。我學到了一些新東西。 – JacamoFinane

1

如果我從你的問題理解是正確的,你正在嘗試做這樣的事情(無需否則

RCLS1: 0, 20, 10, 112, 20, 130, 30, 102 
RCLS2: 0, 16, 10, 53, 20, 96, 30, 45 

,如果你想擁有的對你能做的數據:使用csv模塊)的:

a = {'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]} 

with open('E:\data.csv', 'a+') as f: 
    for k,v in a.items(): 
     f.write("{0}: {1}\n".format(k,", ".join(", ".join(str(j) for j in k) for k in v))) 

輸出(在文件中的日期將是類似這樣的輸出)是這樣的:

with open('E:\data.csv', 'a+') as f: 
    for k,v in a.items(): 
     f.write("{0}: {1}\n".format(k, "".join(", ".join(str(k) for k in v)))) 

輸出:

RCLS1: (0, 20), (10, 112), (20, 130), (30, 102) 
RCLS2: (0, 16), (10, 53), (20, 96), (30, 45) 

編輯:

迅速解決您的新的更新。你可以做這樣的:

a = {'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]} 

with open('E:\data.csv', 'a+') as f: 
    for k,v in a.items(): 
     for j in v: 
      f.write("{0}: {1}\n".format(k, ", ".join(str(k) for k in j))) 

輸出:

RCLS2: 0, 16 
RCLS2: 10, 53 
RCLS2: 20, 96 
RCLS2: 30, 45 
RCLS1: 0, 20 
RCLS1: 10, 112 
RCLS1: 20, 130 
RCLS1: 30, 102 
+1

非常感謝您的想法。看看我的原始描述,我理解你的建議。你介意看看我提供的輸出格式(編輯問題後)的例子嗎?謝謝。 – JacamoFinane

+1

我編輯了我的答案。現在檢查。 –

+1

謝謝@ChihebNexus,你提出的最後一種方法與我所瞄準的輸出相匹配。感謝您的所有建議。學到了新東西! – JacamoFinane

1

使用pandas一個備選答案:

>>> import pandas as pd 
>>> d={'RCLS1':[(0, 20), (10, 112), (20, 130), (30, 102)], 'RCLS2': [(0, 16),(10, 53),(20, 96), (30, 45)]} 
>>> df=pd.DataFrame(d) 


     RCLS1  RCLS2 
0 (0, 20) (0, 16) 
1 (10, 112) (10, 53) 
2 (20, 130) (20, 96) 
3 (30, 102) (30, 45) 
[4 rows x 2 columns] 

>>> dfs=df.stack().reset_index(level=0) 

     level_0   0 
RCLS1  0 (0, 20) 
RCLS2  0 (0, 16) 
RCLS1  1 (10, 112) 
RCLS2  1 (10, 53) 
RCLS1  2 (20, 130) 
RCLS2  2 (20, 96) 
RCLS1  3 (30, 102) 
RCLS2  3 (30, 45) 


>>> dfs=dfs[0].apply(pd.Series) # break the tuples in column with "name"=0 

     0 1 
RCLS1 0 20 
RCLS2 0 16 
RCLS1 10 112 
RCLS2 10 53 
RCLS1 20 130 
RCLS2 20 96 
RCLS1 30 102 
RCLS2 30 45 


>>> dfs.to_csv('fileName.csv') 
+0

謝謝@ ab-user216125,這也是完美的,b/c我希望能夠更好地熟練化幾種皮膚相同的貓。這將被添加到武器庫!謝謝 – JacamoFinane

+0

我在玩各種解決方案,@ ab-user216125。不幸的是,我的字典中包含一些與其他值不同的值,因此在調用df = pd.DataFrame(d)時,錯誤「數組必須全部爲相同長度」結果。我很好奇熊貓DF在這種情況下是否仍然是一種選擇? – JacamoFinane

+0

如果您的RCLS1和RCLS2或RCLSn長度發生變化,您可能會得到稀疏的DataFrame。在這種情況下,您需要考慮您的數據是否是您認爲的數據。熊貓可以很好地處理丟失的數據或刪除行/列或填寫缺失的值。你將處理這些事情的方式完全取決於你。 如果你喜歡這個答案,請投票 - 每個人都喜歡賺取積分;) –