¿Por qué mi dict de python se desordena?

Estoy usando esto para producir un gráfico de% de nombres que comienzan con una determinada letra en un lapso de años. Al trazar (e imprimir) mi dicción (letra_d), las teclas están desordenadas en lugar de ser secuenciales, como la forma en que se agregan al dict. ¿Hay alguna manera de solucionar este problema? Creo que los estoy agregando al dict en un orden secuencial. Si no es así, ¿hay alguna manera de crear los puntos de mi diagtwig de dispersión para simular el trazado de línea correcto?

import csv import matplotlib.pyplot as plt start = 1880 stop = 1890 x = [] years = range(start, stop +1) print years letter_d = {} year_d = {} alphabet = ['Z']#,'C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'] for i in alphabet: letter_d[i] = 0 for year in years: filename = 'yob' + str(year) + '.txt' z = open(filename) year_d[int(year)] = 0 letter_d[i] = year_d c = 0 d = 0 for line in z: y = line.strip().split(',') y.remove(y[1]) c += int(y[1]) if i in y[0]: d += int(y[1]) year_d[year] = float(d)/float(c) #x.append(y) #print year_d print year_d.keys() plt.plot(year_d.keys(), year_d.values()) plt.show() 

Los diccionarios de Python siempre están desordenados.

En su caso, no necesita un diccionario en absoluto . Utilice dos listas; una es la lista de years que ya produjo a partir de un rango, la otra para los valores calculados:

 year_values = [] for year in years: # ... year_values.append(float(d)/float(c)) plt.plot(years, year_values) 

Como se dijo, los diccionarios están desordenados. Para mantener su código, hay una manera de mostrar su diagtwig ordenado. Ordenando las claves del diccionario.

Mira

 if __name__ == "__main__": year_d = {"5": 'b', "3": 'c', "4": 'z', "1":'a'} print year_d.keys() keys = map(int, year_d.keys()) keys = map(keys.sort(), keys) print keys 

original: [‘1’, ‘3’, ‘5’, ‘4’] ordenados: [1, 3, 4, 5]