2017-10-21 71 views
-1

J'essaie de comprendre la fonction max dans ce code. Si j'utilise mon bon sens, je mets la fonction max comme ceci k, max (len (v)) au lieu de ci-dessous. Mais cela me donne une erreur de syntaxe. Comment fonctionne la fonction max ici?Fonction max dans la compréhension

animals = { 'a': ['aardvark'], 'b': ['baboon'], 'c': ['coati']} 

animals['d'] = ['donkey'] 
animals['d'].append('dog') 
animals['d'].append('dingo') 

def biggest(aDict): 
    ''' 
    aDict: A dictionary, where all the values are lists. 

    returns: The key with the largest number of values associated with it 
    ''' 
    # List comprehension 
    return max((k, len(v)) for k, v in aDict.items())[0] 

print(biggest(animals)) 
+1

Il ne se comporte pas différemment. len renvoie un int et max (5) n'a pas de sens car 5 n'est pas une collection de nombres dont vous pouvez obtenir le maximum. Vous n'obtiendrez pas une erreur de syntaxe, cependant, vous obtiendrez un TypeError – jonatan

+0

Oui, vous avez raison sur len. mais animals.items() donne dict_items ([('a', ['aardvark']), ('b', ['baboon']), ('c', ['coati']), ('d' , ['âne', 'chien', 'dingo'])]). Pourquoi max considère rightside mais pas le côté gauche? – Mearex

+0

Vous ne devez pas supposer que max choisira le tuple qui a une deuxième valeur avec la plus grande longueur - c'est incroyablement spécifique. Vous pouvez utiliser le paramètre 'key' de max pour extraire la valeur par laquelle les tuples doivent être comparés. – jonatan

Répondre

0

Vous ne voulez pas la clé maximale, mais la valeur la plus longue. Utilisez l'argument key de max:

from operator import itemgetter 

animals = {'a': ['aardvark', 'donkey', 'dog'], 'b': ['baboon'], 'c': ['coati']} 

def biggest(aDict): 
    ''' 
    aDict: A dictionary, where all the values are lists. 

    returns: The key with the largest number of values associated with it 
    ''' 
    # List comprehension 
    return max(((k, len(v)) for k, v in aDict.items()), key=itemgetter(1))[0] 

print(biggest(animals)) 

Sortie:

a 

Autre solution:

max(animals.items(), key=lambda item: len(item[1]))[0]