2012-02-14 6 views
5

Memorizzo i dati nel dizionario, dove la chiave è un numero intero e il valore è una tupla di numeri interi. Ho bisogno di ottenere la lunghezza dell'elemento più lungo e la sua chiave.Ottenere l'elemento più lungo in Dict

ho trovato questo per ottenere il valore massimo oltre dict:

def GetMaxFlow(flows):   
    maks=max(flows, key=flows.get) 
    return flows[maks],maks 

ho cercato di modificare e come l'uso dei tasti di funzione len, ma non ha funzionato, così ho provato qualcosa di ragionevole e semplice, ancora inefficiente:

def GetMaxFlow(flows): 
    Lens={} 
    for a in flows.iteritems(): 
     Lens[a[0]]=len(a[1]) 
    maks=max(Lens, key=Lens.get) 
    return Lens[maks],maks 

Esiste un modo più elegante e coraggioso per farlo?

risposta

11

Questo è uno dei motivi per cui lambda esiste ancora in Python, penso.

def GetMaxFlow(flows):   
    maks=max(flows, key=lambda k: len(flows[k])) 
    return flows[maks],maks 

Per tornare specificamente un len ...

def GetMaxFlow(flows):   
    maks=max(flows, key=lambda k: len(flows[k])) 
    return len(flows[maks]), maks 

Oppure utilizzare eumiro 's soluzione, che rende di fatto più senso in questo caso. (Ho frainteso la tua domanda.)

+0

Non importa, questo sembra fantastico. – jterrace

+0

bingo! questo è quello che volevo –

+0

si potrebbe facilmente fare semplicemente 'def sorting_key (k): restituisce len (flussi [k])' quindi usare 'sorting_key' al posto di' lambda' quindi non sono sicuro dell'argomento "esiste ancora in Python "ma l'argomento che funziona sicuramente è" questo è un caso che ha molto senso per un'espressione 'lambda'" –

3

Se avete bisogno della lunghezza e la chiave:

def GetMaxFlox(flows): 
    return max((len(v), k) for k,v in flows.iteritems()) 

Se è necessario il valore e la chiave:

def GetMaxFlox(flows): 
    return max((len(v), v, k) for k, v in flows.iteritems())[1:] 

o

def GetMaxFlox(flows): 
    return max(((v, k) for k, v in flows.iteritems()), key=lambda (v,k): len(v)) 
+0

Penso che l'OP voglia restituire una chiave e un valore, non una len e un valore. – senderle

+0

"Ho bisogno di ottenere la lunghezza dell'elemento più lungo e la sua chiave." – eumiro

+0

Ah, giusto! – senderle

0

Non è necessario memorizzare le lunghezze di tutti gli elementi, è sufficiente memorizzare la chiave e la lunghezza del curren tupla più lunga:

def GetMaxFlow(flows): 
    maks_length=0 
    for key,value in flows.iteritems(): 
      if len(value)>=maks_length: 
        maks_key = key 
        maks_length = len(value) 
    return maks_length, maks_key  
Problemi correlati