Extraire, remplacer et transformer des éléments spécifiques de listes Python (tableaux)

Affaires

Pour générer une nouvelle liste en Python en extrayant ou en supprimant uniquement les éléments d'une liste existante (tableau) qui satisfont certaines conditions, ou en effectuant des remplacements ou des conversions, utilisez les compréhensions de listes.

Ce qui suit est expliqué ici, avec un exemple de code.

  • Forme de base de la notation de la compréhension des listes
  • Appliquer le processus à tous les éléments de la liste
  • Extraire et supprimer les éléments de la liste qui répondent aux critères.
  • Remplacer ou convertir les éléments qui satisfont aux conditions de la liste

Voir l'article suivant pour des exemples spécifiques de listes de chaînes de caractères.

Il est également possible d'extraire de manière aléatoire les éléments qui ne répondent pas aux critères.

Notez que les listes peuvent stocker différents types de données et sont strictement différentes des tableaux. Si vous souhaitez manipuler des tableaux dans le cadre de processus nécessitant des adresses mémoire et des tailles de mémoire ou le traitement numérique de données volumineuses, utilisez array (bibliothèque standard) ou NumPy.

La liste suivante est un exemple

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

Forme de base de la notation de la compréhension des listes

Lorsqu'il s'agit de générer une nouvelle liste à partir d'une liste, les comprehensions de listes sont plus simples à écrire que les boucles for.

[expression for any variable name in iterable object if conditional expression]

Une expression est appliquée à un élément qui satisfait l'expression conditionnelle d'un objet itérable (tel qu'une liste ou un tuple) et devient un élément d'une nouvelle liste. L'expression conditionnelle “if” peut être omise, auquel cas l'expression est appliquée à tous les éléments.

Voir l'article suivant pour plus de détails, notamment la notation de la compréhension des listes imbriquées.

Appliquer le processus à tous les éléments de la liste

Par exemple, si vous souhaitez appliquer un traitement à tous les éléments d'une liste, décrivez le traitement souhaité dans l'expression de compréhension de liste ci-dessus.

l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]

l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']

Cette fonction peut être utilisée pour convertir des listes de nombres en listes de chaînes de caractères.

Extraire et supprimer les éléments de la liste qui répondent aux critères.

Si l'élément ne doit être sélectionné que par une expression conditionnelle, il n'est pas traité par une expression, il prend alors la forme suivante

[variable name for variable name in original list if conditional expression]

Une nouvelle liste est générée à partir de laquelle seuls les éléments qui satisfont à la condition (éléments pour lesquels l'expression conditionnelle est vraie) sont extraits.

l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]

l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]

Si l'expression conditionnelle “if” est définie comme “if not conditional expression”, elle devient une négation, et seuls les éléments qui ne satisfont pas à la condition (éléments pour lesquels l'expression conditionnelle est fausse) peuvent être sélectionnés et extraits. En d'autres termes, une nouvelle liste est générée à partir de laquelle les éléments qui satisfont à la condition sont retirés.

l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

Bien entendu, le même résultat est obtenu en spécifiant l'expression conditionnelle équivalente sans utiliser not.

l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

La partie expression conditionnelle peut être constituée de plusieurs conditions. Des “not” négatifs peuvent également être utilisés.

l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]

l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]

Remplacer ou convertir les éléments qui satisfont aux conditions de la liste

Dans l'exemple d'extraction d'éléments ci-dessus, les éléments qui ne remplissaient pas les conditions ont été supprimés.

Si vous souhaitez effectuer des substitutions, des conversions, etc., uniquement sur les éléments qui satisfont aux conditions, appliquez l'opérateur ternaire à la partie expression de la notation de compréhension de liste.

En Python, l'opérateur ternaire peut être écrit comme suit

True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100

b = 30
y = 100 if b > 50 else 0
print(y)
# 0

C'est un peu compliqué, mais la combinaison de la notation de compréhension de liste et des opérateurs ternaires est la suivante.

[True Value if Conditional Expression else False Value for any variable name in original list]

La partie entre parenthèses est l'opérateur ternaire (les parenthèses ne sont pas nécessaires dans le code réel).

[(True Value if Conditional Expression else False Value) for any variable name in original list]

Si un nom de variable est écrit tel quel pour des valeurs vraies ou fausses, la valeur de l'élément d'origine est utilisée telle quelle. Si une expression est écrite, le traitement de cette expression est appliqué.

l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]

l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]

l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]

l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]
Copied title and URL