J'ai un code qui ressemble à quelque chose comme ceci :
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
Ok, c'est simplifié mais vous voyez l'idée. Maintenant thing
pourrait ne pas être dans la liste, dans ce cas je veux passer -1 comme thing_index
. Dans d'autres langues, c'est ce à quoi on s'attendrait index()
à retourner s'il ne trouvait pas l'élément. En fait, il lance un ValueError
.
Je pourrais le faire :
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
Mais ça semble sale, en plus je ne sais pas si ValueError
pourrait être soulevée pour une autre raison. J'ai trouvé la solution suivante, basée sur des fonctions de générateur, mais elle semble un peu complexe :
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
Existe-t-il un moyen plus propre d'obtenir la même chose ? Supposons que la liste ne soit pas triée.
6 votes
"...dans ce cas, je veux passer -1 comme
thing_index
." - Ce n'est absolument pas pythonique. Passer une valeur symbolique (sans signification) au cas où une opération échouerait est mal vu - les exceptions sont vraiment la bonne solution ici. D'autant plus quething_list[-1]
est une expression valide, signifiant la dernière entrée de la liste.1 votes
@jellybean : facepalm ...repérer le codeur java :P
5 votes
@Tim : il y a
str.find
qui fait exactement cela : elle renvoie-1
lorsque l'aiguille ne se trouve pas dans le sujet.0 votes
@Tim None serait mieux alors...et ce serait analogue à dict[key] vs dict.get[key]
0 votes
@SilentGhost : Hm, intéressant. Je devrais peut-être examiner cela plus en détail.
str.index()
lève une exception si la chaîne de recherche n'est pas trouvée.2 votes
L'absence d'une telle fonctionnalité utile sur le type de liste intégré semble être une mauvaise décision de conception. Lorsqu'une exception est levée, cela suggère que quelque chose de mauvais/imprévu s'est produit. Pourtant, la question "Cette valeur est-elle dans la liste, et si oui, quel est son indice ?" constitue une bifurcation typique dans le chemin heureux de nombreux programmes. Ce défaut de conception oblige les programmeurs à choisir le moindre des deux maux : 1) sacrifier les performances et itérer deux fois dans la liste pour obtenir l'indice de la valeur, ou 2) sacrifier la lisibilité et prétendre qu'il s'agit d'une "exception" si la valeur n'est pas dans la liste.
0 votes
Un jour, on se dira : python a des caractéristiques bizarres.