1 svar
238 visningar
lund är nöjd med hjälpen
lund 529
Postad: 29 nov 2020 12:25

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()
Aerius 504 – Fd. Medlem
Postad: 29 nov 2020 13:10

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.

Svara Avbryt
Close