2010-12-01 10 views
2

Existe-t-il un moyen d'interroger rapidement un objet dictionnaire afin de trouver la clé (toutes les clés sont de type chaîne) avec le plus de mots? C'est-à-dire, si l'élément avec la plus grande clé avait cinq mots {'c'est la plus grande clé': 3}, comment pourrais-je interroger rapidement la dict et retourner l'int '5'?Python - Trouver la clé la plus longue du dictionnaire

Best, Georgina

+0

Faut-il utiliser int ou la clé elle-même serait-elle acceptable? –

+0

Qu'en est-il quand il y a une cravate? – JAL

+0

Étant donné la réponse que vous avez acceptée, je dois avoir mal compris l'intention de votre question. Cependant, je maintiens que si vous trouvez que vous devez le faire souvent, vous avez mal choisi vos structures de données. – jtdubs

Répondre

1

max - nombre de mots par clé:

max(len(k.split()) for k in d.keys()) 
+1

Vous étiez rapide! pas besoin d'ajouter '[' et ']'. max (len (i.split()) pour i dans d.iterkeys()) fonctionne bien – mshsayem

+0

@mshsayem Je l'ai enlevé pour lui – jamylak

-1

Aucun raccourci. Une façon simple:

import re 
max([len(re.split('\s+', k)) for k in d.keys()]) 
+0

Wow - merci! C'est parfait! – Georgina

+1

re.split n'est pas nécessaire. La ficelle de chaîne simple() fonctionne bien. – dkamins

2

Cela vous donnera la clé:

max(d, key=lambda x: len(x.split())) 

Et si vous voulez la taille:

max(len(x.split()) for x in d) 
1
longest=max(d.keys(), key=lambda s:len(s.split())) 
len(longest.split()) 
+0

Très bien, il a juste besoin du 5, donc c'est inutile. – Kabie

0
max(len(i.split()) for i in d.iterkeys()) 
0

La réponse est non.

Si vous voulez savoir s'il existe des solutions rapides à taper, vérifiez bien sûr les autres réponses. Mais aucun d'entre eux ne fonctionnera rapidement sur les grands dictionnaires, ce qui je crois était l'esprit de votre question. Si c'est vraiment quelque chose que vous devez faire souvent, vous devez modifier les points dans votre code qui ajoutent et suppriment des clés de votre dictionnaire afin qu'ils maintiennent également un tas de clés, triées par leur nombre de mots.

0

Si vous pouvez garantir que ...

  • il n'y a pas des espaces avant ou arrière
  • mots sont séparés par exactement un espace

comte

max(key.count(' ') for key in d) + 1 
  • Presque zéro nouveaux objets attribués, un iter et quelques ints
  • Cela utilise moins de mémoire et est presque deux fois plus vite que ceux qui utilisent la scission.

Si vous ne pouvez pas ....

de Split

max(len(key.split()) for key in d) 
  • Accepte les valeurs clés irrégulières
  • Même si 1/2 aussi vite que le nombre méthode, ce n'est pas lent.
Questions connexes