2013-03-29 12 views
10
def sort_dictionary(wordDict): 
    sortedList = [] 
    for entry in sorted(wordDict.iteritems(), key = lambda (k, v): (-v, k)): 
     sortedList.append(entry) 

    return sortedList 

La funzione avrebbe ricevuto un dizionario contenente informazioni quali: { 'questo': 1, 'è': 1, 'a': 1, 'grande': 2, ' frase ': 1} Mi piacerebbe averlo generare un elenco di liste, con gli elementi ordinati prima dai valori del dizionario dal più grande al più piccolo, quindi dai tasti in ordine alfabetico.Python 3.2 Lambda Errore di sintassi

La funzione funziona bene se eseguito con Python 2.7.2, ma ricevo l'errore:

File "frequency.py", line 87 
    for entry in sorted(wordDict.iteritems(), key = lambda (k, v): (-v, k)): 
                 ^
SyntaxError: invalid syntax 

quando ho eseguito il programma con Python 3.2.3. Ho cercato dappertutto un motivo per cui, o differenze di sintassi tra 2.7 e 3.2, e non ho trovato nulla. Qualsiasi aiuto o correzione sarebbe molto apprezzato.

+1

Vale la pena notare che mettere spazi tra il '=' e un argomento è contro [PEP-8] (http://www.python.org/dev/ raccomandazioni di peps/pep-0008/# other-recommendations). –

risposta

23

L'utilizzo di parentesi per decomprimere gli argomenti in un lambda non è consentito in Python3. Vedere PEP 3113 per il motivo.

lambda (k, v): (-v, k) 

utilizzare invece:

lambda kv: (-kv[1], kv[0]) 
+0

Perché questa sintassi è stata rimossa? – Blender

+0

Mi picchia, +1. –

+4

@Blender Si è dimostrato poco utilizzato e ha reso scomode le annotazioni sulla funzione, oltre ad aggiungere complessità a qualche introspezione. È anche facilmente sostituibile. Vedi [PEP-3113] (http://www.python.org/dev/peps/pep-3113/). –