Sortera en dict() men blir en lista
Hej,
Jag har gjort ett program i python som tar data från en textfil, som består av data från mätningar på enhetscirkeln, och tar fram ett medelvärde. Till exempel har jag textfilen:
3, 0.5, 0.5, 10
3, 0.5, 0.5, 20
1, 0.1, 0.2, 73
1, 0.11, 0.1, 101
2, 0.23, 0.01, 17
2, 0.12, 0.15, 23
och där är den första kolumnen en batch, andra ett x-värde, tredje ett y-värde och fjärde kolumnen ett mätvärde. Det mitt program gör är att ge mig ett medelvärde för batch 1, 2 och 3. Detta gör jag genom att först spara textfilen med datan som en dict(), sen använder jag sorted() för att sortera så att datan hamnar i numerisk ordning. Problemet här är att efter jag använt sorted så omvandlas min dict() till en lista och då fungerar inte resterande av min kod: hur kan jag göra?
För att förtydliga: Om jag inte använder sorted så fungerar koden som den ska men dess output hamnar som den ligger i textfilen, det vill säga 3, 1 och 2, och är inte numerisk. Om jag använder sorted för att göra den numerisk så fungerar inte övriga kodningen då det nu blir en lista och inte en dict().
Här är hela min kod, där har jag använt mig av sorted och den hittar ni under första def:
import operator
def collect_data(filename):
data = dict() # Or data = {} #definierar denna först
with open(filename, 'r') as h:
for line in h:
four_vals = line.split(',')
batch = four_vals[0]
if not batch in data:
data[batch] = []
try:
data[batch] += [(float(four_vals[1]), float(four_vals[2]), float(four_vals[3]))] # Collect data from an experiment
except ValueError:
print("String not a float")
sorted_data = OrderedDict(sorted(data.items(), key=operator.itemgetter(0)))
print(data)
print(sorted_data)
return data
return sorted_data
def average(sorted_data):
for batch, sample in sorted_data.items():
if len(sample) > 0:
n = 0
x_sum = 0
for (x, y, val) in sample:
if x**2 + y**2 <= 1:
x_sum += val
n += 1
try:
average = x_sum/n
except ZeroDivisionError: # utanför enhetscirkeln
print("Other measurements are made outside the unit circle")
continue
zero_data = False
else:
zero_data = True
print_average(batch, average, zero_data)
def print_average(batch, average, zero_data):
if zero_data == False:
print(batch, "\t", average)
else:
print(batch, "\tNo data")
def main():
'''
This is the main body of the program.
'''
filename = input('Which data file? ')
data = collect_data(filename)
sorted_data = sorted(data.items(), key=operator.itemgetter(0))
average(data)
# Start the main program: This is idiomatic python
if __name__ == '__main__':
main()
Det finns ingen mening med att sortera en dict. Det du exempelvis kan göra är,
när du skapar output gör först en lista med alla nycklar och sortera den listan. Sen
itererar du över den sorterade nyckellistan när du skriver ut innehållet i dict.