2010-09-21 10 views
0

J'ai un dictionnaire avec un entier ou une suite d'entiers comme valeur. Comment puis-je trouver l'entier maximum présent dans les valeurs de dicts?Recherche de la valeur maximale dans un dictionnaire contenant des éléments mixtes en Python

Exemple:

x1 = {0:2, 2:1, 3:(1, 2), 20:3} 

devrait revenir 3 et

x2 = {0:2, 2:1, 3:(1, 5), 20:3} 

devrait retourner 5

+0

Le 'max' pour votre premier exemple devrait-il être' 4', parce que '4' est l'une des clés? – llasram

+0

Pour x1, devrait-il retourner 3 ou 4? – babbitt

+0

Oui, il devrait retourner 3. Sinon la réponse serait max (x1.keys()) – Theodor

Répondre

3

A one-liner:

max(max(v) if isinstance(v, collections.Iterable) else v for v in d.itervalues()) 

a besoin d'au moins 2,6 en raison de python collections.Iterable ABC.

+0

Cela ne semble pas être ce que l'OP veut. – NullUserException

+0

@NUll: Oui, je suis désolé. En fait, je ne sais pas ce que veut OP. Mais je pense que c'est la solution de toute façon :) – SilentGhost

+0

+1 pour one-liner. – Theodor

0

Vous pouvez essayer cette aproche:

  • créer un ensemble pour le stockage des entiers
  • boucle
  • à travers les valeurs du dictionnaire
    • valeurs entières add pour définir
    • ajouter chaque valeur entière des valeurs de tuple pour définir
  • trouver max set

Quelque chose comme ceci:

def maxofdict(x): 
    s = set() 
    for v in x.values(): 
     if hasattr(v, '__len__'): 
     s.update(v) 
     else: 
     s.add(v) 
    return max(s) 
-1

Vous avez besoin d'une fonction générique flatten(). La bibliothèque standard de Python ne fournit pas assez curieusement - pas même en itertools - mais googler autour devrait vous donner une implémentation. Si vous ne me dérange pas d'être potentiellement en arrière incompatible, vous pouvez import une implémentation « privée » de tkinter:

from _tkinter import _flatten as flatten 

def mixed_max(d): 
    return max(flatten(d.items())) 

mixed_max({0: 2, 2: 1, 3: (1,2), 4: 0}) # => 4 
mixed_max({0: 2, 2: 1, 3: (1,5), 4: 0}) # => 5 
+1

-1 pour recommander l'utilisation des détails d'implémentation. '_tkinter' ne fait pas partie de l'API publique, et peut théoriquement changer à tout moment. – lunaryorn

+0

@lunaryorn Euh, oui, je le dis en particulier. La mise en œuvre du 'aplatir()' veut que l'affiche ne soit pas pertinente, donc en saisir un près de chez vous simplifie l'exemple. – llasram

0

En supposant que le résultat correct pour x1 = 4;

def maxOfMixedDict(x): 
    max = 0 
    for key, value in x.items(): 
     if(key > max): 
      max = key 
     try: 
      for v2 in value: 
       if(v2 > max): 
        max = v2 
     except TypeError, e: 
      pass 

    return max 
1
max(max(k,max(v) if isinstance(v,collections.Iterable) else v) for k,v in x1.items()) 

L'autre un-liner ne tient pas compte des clés.

Ceci est icky parce que ce n'est pas l'utilisation conçue d'un dictionnaire: les clés sont censées être des clés, pas elles-mêmes des magasins de données. Je pense que vous devriez reconsidérer votre structure de données.

EDIT: Ce qui précède était un non-sens. Merci à @SilentGhost pour l'avoir signalé.

+0

cela renvoie 4 pour 'x1' – SilentGhost

+0

@SilentGhost: il en est ainsi. OP stupide. – katrielalex

+1

vous n'avez pas besoin de faire 'max (x1.keys())', vous pouvez juste faire 'max (x1)'. mais au-delà de votre code n'a tout simplement pas de sens. – SilentGhost

1

Ceci est ma version d'un paquebot ne nécessitant pas 2.6:

x1 = {0:2, 2:1, 3:(1, 2), 20:3} 
x2 = {0:2, 2:1, 3:(1, 5), 20:3} 
print max(max(values) if hasattr(values,'__iter__') else values for values in x1.values()) 
print max(max(values) if hasattr(values,'__iter__') else values for values in x2.values()) 

Sortie:

3 
5 

CEPENDANT je vous suggère fortement d'aller à l'origine de ces valeurs et changer le stockage des entiers à tuples singleton .Ensuite vous pouvez utiliser un code plus propre:

x1 = {0:(2,), 2:(1,), 3:(1, 2), 20:(3,)} 
x2 = {0:(2,), 2:(1,), 3:(1, 5), 20:(3,)} 
for x in (x1,x2): 
    print max(max(values) for values in x.values()) 
+0

Bonne idée. Hey votre tout à 1000 rep. Félicitations =) – Theodor

+0

Et il correspond que je viens de fonder la société appelée Ysisoft (Ninesoft) 9.9.2010 9 heures et rep est en 990 :) –

Questions connexes