2010-11-23 7 views
4
alphanumériques

j'ai un dictionnaire de clés comme les résultats dans A1, A10, A11 A1-A15, B1-B15, etc. Exécution dictionary.keys(). Sort() ...Tri clés de dictionnaire en python

def sort_keys(dictionary): 
    keys = dictionary.keys() 
    keys.sort() 
    return map(dictionary.get, keys) 

Comment puis-je le trier pour qu'il soit dans le bon ordre, c'est-à-dire A1, A2, A3 ...?

+0

Ces réponses sont obsolètes. Une solution plus simple utilisant 'natsort' peut être trouvée [ici] (https://stackoverflow.com/questions/46151132/sorting-dictionary-with-alphanumeric-keys-in-natural-order/46151175#46151175). –

Répondre

9
keys.sort(key=lambda k:(k[0], int(k[1:]))) 

Edit: Cette va échouer dans les touches ne sont pas comme A23, par exemple AA12 arrêtera le programme. Dans le cas général, voir Python analog of natsort function (sort a list using a "natural order" algorithm).

+0

Beau, mec! –

+0

Très bien, les clés seront toujours les mêmes. C'est très lisible et le genre de chose que je cherchais. –

+0

Ou, (une légère variante): 'keys.sort (clé = lambda x: x [0] + x [1:]. Zfill (5))' (déplacé d'une réponse sur une suggestion par @AalokParikh) – JesseW

1

dictionary.keys() retourne une liste et vous pouvez trier la liste par votre propre fonction:

>>> a = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')] 
>>> import operator 
>>> a.sort(key = operator.itemgetter(1)) 
>>> a 
[(u'.', '.'), (u'we', 'PRP'), (u'you', 'PRP'), (u'saw', 'VBD'), (u'bruh', 'VBP')]* 
0

Vous avez besoin OrderedDict des collections de 2,7 +

>>> # regular unsorted dictionary 
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

>>> # dictionary sorted by key 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) 
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

>>> # dictionary sorted by value 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) 
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) 

>>> # dictionary sorted by length of the key string 
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])