【问题标题】:Python: Writing to a csv file from a 'list' of {(tuples): value} dictsPython:从 {(tuples): value} dicts 的“列表”写入 csv 文件
【发布时间】:2011-07-22 20:56:04
【问题描述】:

大家好。

我有一个 [(tuple): value] 字典作为列表中的元素,如下所示:

lst = [{('unit1', 'test1'): 11, ('unit1','test2'): 12}, {('unit2','test1'): 13, ('unit2','test2'):14 }]

testnames = ['test1','test2']
unitnames = ['unit1','unit2']

如何使用以下输出写入 csv 文件?

单元名称、test1、test2

单元 1、11、12

单元2、13、14

谢谢。

【问题讨论】:

  • 我无法理解你想要输出什么......unitname 是什么?
  • 我的坏.. 已编辑。输出的第一行是 csv 的标题。

标签: python list csv dictionary tuples


【解决方案1】:

首先,扁平化结构。

units = collections.defaultdict(lambda: collections.defaultdict(lambda: float('-inf')))
for (u, t), r in lst.iteritems():
  units[u][t] = r
table = [(u, t['test1'], t['test2']) for (u, t) in units.iteritems()]

然后使用csv写出CSV文件。

【讨论】:

    【解决方案2】:

    以下代码创建一个可以转储到 csv 的 dict:

    from collections import defaultdict
    d = defaultdict(list)
    for (unit, test), val in lst.items():
        d[unit].append(val)
    

    【讨论】:

      【解决方案3】:

      你的分组方式是多余的;所有键都是唯一的,它也可能是一个字典,因为

      data = {
          ('unit1', 'test1'): 11,
          ('unit1', 'test2'): 12,
          ('unit2', 'test1'): 13, 
          ('unit2', 'test2'): 14
      }
      

      然后

      import csv
      
      def getUniqueValues(seq):
          "Return sorted list of unique values in sequence"
          values = list(set(seq))
          values.sort()
          return values
      
      def dataArray(data2d, rowIterField=0, rowLabel='', defaultVal=''):
          # get all unique unit and test labels
          rowLabels = getUniqueValues(key[rowIterField] for key in data2d)
          colLabels = getUniqueValues(key[1-rowIterField] for key in data2d)
      
          # create key-tuple maker
          if rowIterField==0:
              key = lambda row,col: (row, col)
          else:
              key = lambda row,col: (col, row)
      
          # header row
          yield [rowLabel] + colLabels
          for row in rowLabels:
              # data rows
              yield [row] + [data2d.get(key(row,col), defaultVal) for col in colLabels]
      
      def main():
          with open('output.csv', 'wb') as outf:
              outcsv = csv.writer(outf)
              outcsv.writerows(dataArray(data, 0, 'unitnames'))
      
      if __name__=="__main__":
          main()
      

      通过将dataArray(data, 0, 'unitnames') 更改为dataArray(data, 1, 'testnames'),可以轻松地翻转输出(跨单元、向下测试)。

      【讨论】:

      • 你的意思是'data2d'是字典'data'吗?
      • @siva:是的;如果您将data 作为第一个参数传递给dataArray(),那么inside dataArray 将被称为data2d。回想起来,它可能应该被称为“paired_key_dict”之类的东西;随意更改它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 2015-06-08
      相关资源
      最近更新 更多