71 votes

Vérifier l'existence d'un élément dans le tableau

En PHP, il existe une fonction appelée isset() pour vérifier si quelque chose (comme un index de tableau) existe et a une valeur. Qu'en est-il de Python ?

J'ai besoin de l'utiliser sur les tableaux car j'obtiens parfois "IndexError : list index out of range" (erreur d'indexation : l'index de la liste n'est pas compris).

Je suppose que je pourrait utiliser try/catching, mais en dernier recours.

2 votes

FEPA : Il est plus facile de demander le pardon que d'obtenir la permission.

5 votes

Votre question porte sur les tableaux PHP (qui sont à peu près des dictionnaires en Python) mais votre message d'erreur fait référence à une opération de liste. Un exemple de code pourrait probablement dissiper la confusion.

1 votes

En outre : "dernier recours". Le "dernier recours" est quelque chose de très différent.

118voto

wim Points 35274

Regardez avant de sauter ( LBYL ):

if idx < len(array):
    array[idx]
else:
    # handle this

Il est plus facile de demander le pardon que la permission ( FEPA ):

try:
    array[idx]
except IndexError:
    # handle this

À Python, l'EAFP semble être le style populaire et préféré. Il est généralement plus fiable et évite toute une catégorie de bogues (temps de vérification vs. temps d'utilisation). Toutes choses égales par ailleurs, la méthode try / except est recommandée - ne la considérez pas comme un "dernier recours".

Cet extrait est tiré de la documentation officielle citée plus haut, qui préconise l'utilisation de try/except pour le contrôle de flux :

Ce style de codage Python courant suppose l'existence de clés ou d'attributs valides et capture les exceptions si l'hypothèse s'avère fausse. Ce style propre et rapide se caractérise par la présence de nombreuses instructions "essayer" et "sauf".

51voto

Tadeck Points 37046

AEPF vs LBYL

Je comprends votre dilemme, mais Python n'est pas PHP et le style de codage connu sous le nom de Il est plus facile de demander le pardon que la permission (o FEPA en bref) est un style de codage courant en Python .

Voir la source (de la documentation ):

FEPA - Il est plus facile de demander le pardon que la permission. Ce style de codage courant en Python suppose l'existence de clés ou d'attributs valides et attrape les exceptions si l'hypothèse s'avère fausse. Ce style propre et rapide se caractérise par la présence de nombreuses instructions try et except. Cette technique contraste avec le style LBYL commun à de nombreux autres langages tels que le C.

Donc, en gros, L'utilisation des instructions try-catch n'est pas un dernier recours, c'est une pratique courante. .

"Les tableaux en Python

PHP dispose de tableaux associatifs et non associatifs, Python dispose de listes, de tuples et de dictionnaires. Les listes sont similaires aux tableaux non associatifs de PHP, les dictionnaires sont similaires aux tableaux associatifs de PHP.

Si vous voulez vérifier si la "clé" existe dans le "tableau", vous devez d'abord savoir de quel type il s'agit dans Python, car ils produisent des erreurs différentes lorsque la "clé" n'est pas présente :

>>> l = [1,2,3]
>>> l[4]

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    l[4]
IndexError: list index out of range
>>> d = {0: '1', 1: '2', 2: '3'}
>>> d[4]

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    d[4]
KeyError: 4

Et si vous utilisez le style de codage de l'EAFP, vous devriez simplement détecter ces erreurs de manière appropriée.

Style de codage LBYL - vérification de l'existence des index

Si vous tenez à utiliser l'approche LBYL, ces solutions sont faites pour vous :

  • pour les listes Il suffit de vérifier la longueur et si possible_index < len(your_list) entonces your_list[possible_index] existe, sinon il n'existe pas :

    >>> your_list = [0, 1, 2, 3]
    >>> 1 < len(your_list) # index exist
    True
    >>> 4 < len(your_list) # index does not exist
    False
  • pour les dictionnaires vous pouvez utiliser in et si le mot-clé possible_index in your_dict entonces your_dict[possible_index] existe, sinon il n'existe pas :

    >>> your_dict = {0: 0, 1: 1, 2: 2, 3: 3}
    >>> 1 in your_dict # index exists
    True
    >>> 4 in your_dict # index does not exist
    False

Est-ce que cela a aidé ?

15voto

Amadan Points 41944
`e` in ['a', 'b', 'c']  # evaluates as False
`b` in ['a', 'b', 'c']  # evaluates as True

EDIT : Avec la clarification, nouvelle réponse :

Notez que les tableaux de PHP sont très différents de ceux de Python, combinant les tableaux et les dicts en une structure confuse. Les tableaux Python ont toujours des indices de 0 a len(arr) - 1 Vous pouvez ainsi vérifier si votre indice se situe dans cette fourchette. try/catch est un bon moyen de le faire de manière pythonique.

Si vous vous interrogez sur la fonctionnalité de hachage des "tableaux" de PHP (les "tableaux" de Python), vous devez savoir qu'il existe une fonction de hachage pour les tableaux de Python. dict ), alors ma réponse précédente reste en quelque sorte valable :

`baz` in {'foo': 17, 'bar': 19}  # evaluates as False
`foo` in {'foo': 17, 'bar': 19}  # evaluates as True

9voto

Arik Harel Points 1

has_key est rapide et efficace.

Au lieu d'un tableau, utilisez un hachage :

valueTo1={"a","b","c"}

if valueTo1.has_key("a"):
        print "Found key in dictionary"

4 votes

AttributeError: 'set' object has no attribute 'has_key'

2voto

DRH Points 3773

Vous pouvez utiliser la fonction intégrée dir() pour produire un comportement similaire à celui de PHP isset() , quelque chose comme :

if 'foo' in dir():  # returns False, foo is not defined yet.
    pass

foo = 'b'

if 'foo' in dir():  # returns True, foo is now defined and in scope.
   pass

dir() renvoie une liste des noms dans le champ d'application actuel, plus d'informations peuvent être trouvées ici : http://docs.python.org/library/functions.html#dir .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X