Du kannst Slicing auch mit einem einfachen Indexzugriff kombinieren:
Code: Alles auswählen
new_list.append([row[2]] + row[6:11])
Code: Alles auswählen
new_list.append([row[2]] + row[6:11])
Code: Alles auswählen
# Erstelle eine Liste mit 5 Tupeln. Liste = [] Tuple = ()
>>> a = [(0,0,1,5,2,3.2312), (0,0,1,5,2,3.2310), (0,0,1,5,2,3.2311), (0,0,1,5,4,4.5311), (0,0,1,5,3,4.5317)]
>>> groups = {} # Erstelle ein dict mit dem Namen groups
>>> for part in a: # Für jedes Element (part) in in a tue (Element sind hier die einzelnen Tuple in der Liste)
testname = part[0:5] # testname sind die Elemente 0-4 von Part (beim ersten Durchlauf also 0,0,1,5,2)
if testname not in groups: # wenn noch kein Schlüssel namens Testname in groups ist
groups[testname] = [] # lege den Schlüssel an und hinterlege als Hinhalt eine leere Liste
groups[testname].append(part[5]) # füge an die Liste mit Schlüssel 'testname' in groups das 4. Element aus part an
# dieser wert wird später in der schleifa ls "values" wieder abgerufen
>>> groups
{(0, 0, 1, 5, 4): [4.5311], (0, 0, 1, 5, 3): [4.5317], (0, 0, 1, 5, 2): [3.2312, 3.231, 3.2311]}
>>> for testname, values in groups.items(): # für jede schlüssel (testname) in dem dict groups finde den wert (values)
avg = sum(values) / len(values) # avg ist die summe aller elemente in values durch deren anzahl
print "Test '%s' hat einen Durchschnitt von: %f" % (testname, avg)
Test '(0, 0, 1, 5, 4)' hat einen Durchschnitt von: 4.531100
Test '(0, 0, 1, 5, 3)' hat einen Durchschnitt von: 4.531700
Test '(0, 0, 1, 5, 2)' hat einen Durchschnitt von: 3.231100
Code: Alles auswählen
import csv
import string
import xlwt3
import os
import sys
import time
import re #needed for whitelist / pattern search
from operator import itemgetter
from datetime import date
if len(sys.argv) < 2:
print('error: specify input file path\n\nusage: phyton.exe create_xls2.py <input csv file>')
sys.exit(2)
print('Parsing...')
infile = sys.argv[1] #'infiletest.csv'
outfile = infile.rsplit('\\',1)[0] + '\\Test' + time.strftime("-%Y-%m-%d_%H-%M-%S") + '.xls'
#open csv file
filecsv = open(infile, "r")
reader = csv.reader(filecsv, delimiter=",")
csv_writer = csv.writer(open(infile.rsplit('\\',1)[0] + '\\Test' + time.strftime("-%Y-%m-%d_%H-%M-%S") + '.csv', "w"), lineterminator='\n')
title=("band","datarate","PCL","test","measurement","min","avg","max")
csv_writer.writerow(title)
new_list=[]
for row in reader:
new_list.append([row[2],row[6],row[7],row[8],row[9],row[10]])
print("sorting")
sorted(new_list, key=itemgetter(0,1,2,3,4))
print("Build groups")
groups = {}
for part in new_list:
testname = part[0:5]
testname2 = tuple(testname)
if testname2 not in groups:
groups[testname2] = []
groups[testname2].append(part[5])
print("calc avg,min,max")
for testname2, values in groups.items():
for l in range(len(values)):
values[l] = float(values[l])
avg = sum(values) / len(values)
maximum = max(values)
minimum = min(values)
temp = (testname2,minimum,avg,maximum)
csv_writer.writerow(temp)
Code: Alles auswählen
for l in range(len(values)):
values[l] = float(values[l])
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv
from collections import defaultdict
from itertools import imap
from operator import itemgetter
class Aggregator(object):
def __init__(self):
self.count = 0
self.sum = 0
self.min = self.max = None
def __call__(self, value):
self.count += 1
self.sum += value
if self.max is None:
assert self.min is None
self.max = self.min = value
else:
self.max = max(self.max, value)
self.min = min(self.min, value)
@property
def average(self):
return self.sum / self.count
def main():
with open('test.csv', 'rb') as in_file:
reader = csv.reader(in_file, delimiter=',')
_headers = reader.next()
results = defaultdict(Aggregator)
rows = imap(itemgetter(2, 6, 7, 8, 9, 10), reader)
for band, datarate, pcl, test, measurement, result in rows:
results[(band, datarate, pcl, test, measurement)](float(result))
for key, result in sorted(results.iteritems()):
print '%r: #=%d avg=%.3f min=%.3f max=%.3f' % (
key, result.count, result.average, result.min, result.max
)
if __name__ == '__main__':
main()
Code: Alles auswählen
band,datarate,PCL,test,measurement,min,avg,max
('WLANG', '54', '13000', 'OFDM.CFL', 'FrequencyLeakage'),-47.316831,-41.10720679166667,-37.296583
('WLANA', '6', '17000', 'OFDM.Spectral.Mask', 'ReferenceLevelResult'),-53.010223,-52.609291722222224,-51.98594
('WLANB', '11', '18000', 'DSSS.POWERRAMP', 'NumDownRampVectorSamples'),1000.0,1000.0,1000.0
...
Code: Alles auswählen
Messung1,('WLANG', '54', '13000', 'OFDM.CFL', 'FrequencyLeakage'),-47.316831,-41.10720679166667,-37.296583
Messung2,('WLANG', '54', '13000', 'OFDM.CFL', 'FrequencyLeakage'),-45.316831,-45.10720679166667,-35296583
Messung3,('WLANG', '54', '13000', 'OFDM.CFL', 'FrequencyLeakage'),-46.316831,-46.10720679166667,-36.296583
...