2017-04-13 139 views
0

我在形式元组的列表:如何将元组列表写入一个csv文件,其中元组的第一个元素是字典?

data = [({1: 0.1723, 2: 0.890, 3: 1.0}, 'a'), 
     ({1: 0.0, 2: 1.0, 3: 0.667}, 'b'), 
     ({1: 0.223, 2: 0.336, 3: 1.0}, 'b')] 

每个元组的第二个元件是一个简单的字符串。

如何将它写入csv文件,以便连续的列对应于每个元素?

即:为:col1 = 0.1723col2 = 0.890col3 = 1.0col4 = 'a'

+1

钥匙将是连续的。 –

+0

@PeterWood是的,但你总是可以对键进行排序。 –

+0

@ Jean-FrançoisFabre字典中元素的顺序必须保持不变,并且在整个文件中应该保持一致。 –

回答

0

您可以使用生成器表达式一次生成所有行,它们分为两部分。

  • 根据关键字排序的字典的值列表字符串
  • 单元素列表

验证码:

import csv 

data = [({1: 0.1723, 2: 0.890, 3: 1.0}, 'a'), 
     ({1: 0.0, 2: 1.0, 3: 0.667}, 'b'), 
     ({1: 0.223, 2: 0.336, 3: 1.0}, 'b')] 

with open("output.csv","w",newline="") as f: # python 2: just: ,"wb") 
    cw = csv.writer(f) 
    cw.writerows([v for _,v in sorted(d.items())] + [s] for d,s in data) 

创建下列文件:

0.1723,0.89,1.0,a 
0.0,1.0,0.667,b 
0.223,0.336,1.0,b 

for d,s in data只是解开字典(第一项)和值(第二项)的好方法。并且csv模块将浮点数整数转换为字符串,无需为此而烦恼。

0

,你可以做到这一点,如下所示:

import csv 

data = [({1: 0.1723, 2: 0.890, 3: 1.0}, 'a'), ({1: 0.0, 2: 1.0, 3: 0.667}, 'b'), ({1: 0.223, 2: 0.336, 3: 1.0}, 'b')] 
rows = [] 
for the_dict, the_char in data: 
    row = [] 
    # get values from dictionary and add it to row 
    for x in the_dict.values(): 
     row.append(x) 
    # add char 
    row.append(the_char) 
    # ad row to rows list 
    rows.append(row) 

with open("output.csv", "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows(rows) 
0

这里是另一种解决方案:为'dict`不排序

import csv 

data = [({1: 0.1723, 2: 0.890, 3: 1.0}, 'a'), 
     ({1: 0.0, 2: 1.0, 3: 0.667}, 'b'), 
     ({1: 0.223, 2: 0.336, 3: 1.0}, 'b')] 

def make_row(elements): 
    row = list() 
    for obj in elements: 
     if isinstance(obj, dict): 
      row += obj.values() 
     else: 
      row.append(obj) 
    return row 

with open('output.csv', 'w') as handle: 
    writer = csv.writer(handle) 
     for row in data: 
      writer.writerow(make_row(row)) 
相关问题