2017-04-14 50 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。在这种情况下,您需要考虑您的数据是否是您认为的数据。熊猫可以很好地处理丢失的数据或删除行/列或填写缺失的值。你将处理这些事情的方式完全取决于你。 如果你喜欢这个答案,请投票 - 每个人都喜欢赚取积分;) –