2016-04-13 9 views

Antwort

5

Wörterbücher sind nicht sortiert, Sie können ein Wörterbuch nicht sortieren. Sie benötigen ein Ordereddict, das Sie aus einer Liste von sortierten Tupeln von Schlüssel-, Wert-Paaren Ihres aktuellen Diktats erstellen können.

>>> months = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'] 
>>> input = {'JUL':15,'MAR': 54,'DEC':65,'OCT':90} 
>>> from collections import OrderedDict 
>>> OrderedDict(sorted(input.items(),key =lambda x:months.index(x[0]))) 
OrderedDict([('MAR', 54), ('JUL', 15), ('OCT', 90), ('DEC', 65)]) 
0

Eine Schlüsselsortierfunktion wie die PHP ksort():

def ksort(d, func = None): 
    keys = d.keys() 
    keys.sort(func) 
    return keys 

for k in ksort(dic): 
    print k, d[k] 
+0

Sie könnten tun 'Rückkehr sortiert (d) 'in' ksort() ' – zondo

0

können Sie Wörterbücher in Python Gebrauch in Sammlungen Modul. Siehe das folgende Beispiel.

import collections 

print 'Regular dictionary:' 
d = {} 
d['a'] = 'A' 
d['b'] = 'B' 
d['c'] = 'C' 
d['d'] = 'D' 
d['e'] = 'E' 

for k, v in d.items(): 
    print k, v 

print '\nOrderedDict:' 
d = collections.OrderedDict() 
d['a'] = 'A' 
d['b'] = 'B' 
d['c'] = 'C' 
d['d'] = 'D' 
d['e'] = 'E' 

for k, v in d.items(): 
    print k, v 

Ausgabe

Regular dictionary: 
a A 
c C 
b B 
e E 
d D 

OrderedDict: 
a A 
b B 
c C 
d D 
e E 
3

Sie wollen, dass sie durch die Zahl des Monats sortieren, so dass Sie eine Abbildung von Ihrem Monat Abkürzungen auf die Zahl des Monats erstellen müssen:

dic = {'JUL':15, 'MAR': 54,'DEC':65,'OCT':90} 

import calendar 
month_numeric_mapping = {abb: index for abb in dic 
            for index, long in enumerate(calendar.month_name[1:]) 
            if str.lower(abb) in str.lower(long)} 

>>> month_numeric_mapping 
{'DEC': 11, 'JUL': 6, 'MAR': 2, 'OCT': 9} 

Dann definieren Sie eine Funktion, die mit sorted verwendet werden kann, um diese Nummer zu erhalten:

def getMonthNumber(item): 
    return month_numeric_mapping[item[0]] 

und schließlich müssen Sie OrderedDict einen Auftrag-aware Wörterbuch haben die sortierte Ausgabe zu speichern:

>>> from collections import OrderedDict 
>>> a = OrderedDict(sorted(dic.items(), key=getMonthNumber)) 
>>> a 
OrderedDict([('MAR', 54), ('JUL', 15), ('OCT', 90), ('DEC', 65)]) 


Eine weitere Möglichkeit calendar.month_abbr zu verwenden ist:

month_numeric_mapping = {abbr.upper(): i for i, abbr in enumerate(calendar.month_abbr[1:])} 

def getMonthNumber(item): 
    return month_numeric_mapping[item[0]] 

a = OrderedDict(sorted(dic.items(), key=getMonthNumber)) 
>>> a 
OrderedDict([('MAR', 54), ('JUL', 15), ('OCT', 90), ('DEC', 65)]) 
Verwandte Themen