Python: запись в CSV-файл из «списка» из диктовок {(tuples): value} - PullRequest
2 голосов
/ 25 марта 2011

Приветствую всех.

У меня есть [(tuple): value] dicts как элементы в списке следующим образом:

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

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

Как записать в CSV-файл со следующим выводом?

имена устройств, test1, test2

unit1, 11, 12

unit2, 13, 14

Спасибо.

Ответы [ 3 ]

4 голосов
/ 25 марта 2011

Сначала сгладьте структуру.

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.

1 голос
/ 25 марта 2011

Способ, которым вы сгруппировали lst, избыточен;все ключи уникальны, это может быть также один словарь, например

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').

1 голос
/ 25 марта 2011

Следующий код создает dict, который может быть выгружен в CSV:

from collections import defaultdict
d = defaultdict(list)
for (unit, test), val in lst.items():
    d[unit].append(val)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...