2012-02-14 13 views
5

Almacena datos en el diccionario, donde la clave es un número entero, y el valor es una tupla de números enteros. Necesito obtener la longitud del elemento más largo y su clave.Obtiene el elemento más largo en Dict

He encontrado esto para conseguir el valor máximo sobre dict:

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

Me trataron de modificar y, como el uso de teclas de funciones len, pero no funcionó, así que hemos probado algo razonable y sencillo, aún ineficiente:

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 

¿Hay una forma más elegante y pitónica de hacerlo?

Respuesta

11

Esta es una de las razones por las que lambda todavía existe en Python, creo.

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

Para volver específicamente un len ...

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

O utilizar la solución eumiro 's, que en realidad tiene más sentido en este caso. (No he entendido bien su pregunta.)

+0

No importa, esto se ve muy bien. – jterrace

+0

¡bingo! eso es lo que quería –

+0

fácilmente podría hacer 'def sorting_key (k): return len (flows [k])' luego use 'sorting_key' en lugar de' lambda' así que no estoy seguro acerca del argumento "todavía existe en Python "pero el argumento que definitivamente funciona es" este es un caso que tiene mucho sentido para una expresión 'lambda' " –

3

Si necesita la longitud y la clave:

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

Si necesita el valor y la clave:

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

Creo que OP quiere devolver una clave y un valor, no un len y un valor. – senderle

+0

"Necesito obtener la longitud del elemento más largo y su clave". – eumiro

+0

Ah, ¡está bien! – senderle

0

No necesita almacenar las longitudes de todos los elementos, solo necesita almacenar la clave y la longitud de la corriente la tupla más larga:

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  
Cuestiones relacionadas