Python >> Tutoriel Python >  >> Python

Comment obtenir des éléments spécifiques à partir d'une liste ? - La manière la plus pythonique !

Résumé d'article rapide pour obtenir un élément spécifique d'une liste :

  • Obtenir des éléments par index
    • utiliser l'opérateur [] avec l'index de l'élément
    • utiliser la méthode de la liste pop(index)
    • utiliser le découpage lst[start:stop:step] pour obtenir plusieurs éléments à la fois
    • utiliser la fonction itemgetter() depuis le module opérateur
  • Obtenir des éléments par condition
    • utiliser le filter() fonction
    • utiliser une déclaration de compréhension de liste

Les listes Python font sûrement partie des incontournables de tout développeur Python. Ils vous permettent de stocker, d'itérer et de manipuler des données efficacement et avec très peu de code. Pourtant, il existe un autre sujet de liste important :comment accéder aux éléments de la liste ?

Dans la première partie de cet article, vous apprendrez toutes les manières possibles d'obtenir des éléments spécifiques à partir d'une liste. Dans la deuxième partie, vous verrez comment appliquer la théorie à des questions pratiques.

Prenons comme exemple une liste ps contenant des points de l'espace 2D. Si vous avez besoin de plus d'informations sur les listes, je souhaite vous recommander cet article.

Obtenir des éléments spécifiques de la liste par index

Pour accéder à n'importe quel élément d'une liste, utilisez l'opérateur crochets avec l'index de l'élément que vous souhaitez récupérer. Par exemple. si nous voulons accéder au point (4, 5) de notre liste ps nous écrivons :

# list of points from the 2D space
ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
point = ps[2]


Les indices commencent à 0, donc l'indice du troisième élément est 2. En Python, il est également possible de compter de l'arrière vers l'avant en utilisant des indices négatifs.
C'est très pratique, notamment pour récupérer le dernier ou l'avant-dernier élément.
L'indice du dernier élément d'une liste est -1, l'indice de l'avant-dernier est -2 et ainsi de suite.

Essayez-le :

Obtenir des éléments spécifiques de la liste à l'aide de pop()

Si vous souhaitez accéder à un élément d'une liste et le supprimer, appelez la méthode pop() avec
l'indice de l'élément. Si vous ne transmettez pas de valeur pour l'index, la méthode pop()
renvoie et supprime le dernier élément de la liste.
Voici comment obtenir et supprimer l'élément (4, 5) en utilisant la méthode pop() :

# list of points from the 2D space
ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]

item = ps.pop(2)
print(ps)
# [(2, 4), (-1, 7), (3, -4), (-1, -5)]

Maintenant, la variable item a la valeur (4, 5).

Obtenir des éléments spécifiques de la liste avec découpage

Pour obtenir une plage continue d'éléments à partir d'une liste, utilisez le découpage.
Le découpage utilise également l'opérateur parenthèses avec un index de début et de fin.
En tant que code, il ressemble à ceci :

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
items = ps[2:4]


où le premier nombre avant les deux-points (:) est l'index de début et le deuxième nombre,
après les deux-points, est l'index final. L'index de début est inclus, l'index de fin est exclu.
Dans notre exemple items = ps[2:4] l'indice de début est 2, l'indice de fin est 4.
Puisque l'indice de départ est inclus, nous obtenons les éléments aux indices 2 et 3.
L'index de fin n'est pas inclus, donc l'élément à l'index 4 n'est pas inclus.
Ainsi, la valeur de la variable items sera [(4, 5), (3, -4)]

Avec le découpage en tranches, vous pouvez utiliser une troisième étape de paramètre pour obtenir des éléments dans une plage avec
distances régulières. En savoir plus sur le tranchage dans notre article détaillé.

itemgetter()

L'opérateur de module fournit la fonction itemgetter qui vous permet
pour accéder simultanément à plusieurs éléments d'une liste.
Voici le code :

from operator import itemgetter

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
got = itemgetter(0, 2, 3)(ps)

Après cette ligne, la variable got contient les éléments des indices 0, 2, 3 sous forme de tuple.

Obtenir les éléments de la liste à l'aide de filter()

Dans les solutions dont nous avons discuté précédemment, nous avons utilisé des indices pour obtenir des éléments d'un
liste. Une autre possibilité est d'obtenir des éléments d'une liste par une certaine condition.
Par exemple, nous pourrions vouloir obtenir tous les éléments de la liste ps qui ont une distance
de 6,0 ou plus à partir de (0, 0). Comme nous ne connaissons pas les indices de ces éléments, nous
ne peut pas utiliser une solution qui nécessite les indices. Python fournit une fonction intégrée appelée filter().
La méthode filter() nécessite deux paramètres :
une fonction qui retourne True/False et un itérable.
La fonction filter() applique la fonction à chaque élément de l'itérable et
ne conserve que les éléments pour lesquels la fonction a renvoyé True.

En utilisant la fonction filter(), nous pouvons obtenir tous les éléments avec une distance supérieure à
6.0 à partir de (0, 0) comme ceci :

def dist(x):
    return (x[0] ** 2 + x[1] ** 2) ** 0.5

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
filtered = list(filter(lambda x: dist(x) > 6.0, ps))

Comme vous pouvez le voir dans le code, le résultat de la fonction filter() doit être converti
retour à une liste.

Compréhension de la liste avec condition

Besoin d'informations sur la compréhension des listes ? En savoir plus ici.

Une autre façon d'obtenir tous les éléments d'une liste qui satisfont à une certaine condition est un
compréhension de la liste. L'algorithme derrière la compréhension de liste s'appelle la recherche linéaire.
La recherche linéaire effectue une itération sur l'entrée une fois et ajoute tous les éléments qui satisfont
condition à une nouvelle liste.
Dans notre exemple où nous voulions obtenir tous les points de la liste ps dont la distance à
(0, 0) est supérieur à 6,0, nous avons besoin du code suivant :

def dist(x):
    return (x[0] ** 2 + x[1] ** 2) ** 0.5

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
filtered = [p for p in ps if dist(p) > 6.0]

Essayez vous-même :

Applications

Dans cette section, nous voulons élargir un peu le champ d'application et voir comment nous pouvons appliquer le
solutions présentées ci-dessus. Par conséquent, nous avons choisi des problèmes communs.

Obtenir des indices spécifiques à partir de la liste

Pour obtenir tous les indices d'un sous-ensemble d'éléments qui satisfont une certaine condition,
utiliser une compréhension de liste :

def dist(x):
     return (x[0] ** 2 + x[1] ** 2) ** 0.5

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
filtered = [idx for idx, p in enumerate(ps) if dist(p) > 6.0]

Obtenir des lignes spécifiques à partir du fichier

Supposons que vous souhaitiez obtenir tous les commentaires d'un fichier de code.
Encore une fois, je suggère d'utiliser une compréhension de liste et pour analyser chaque ligne une expression régulière.

import re

pattern = r'^#.*$'
comments = [line for line in open('code.py') if re.match(pattern, line)]

Si vous souhaitez en savoir plus sur la lecture des lignes d'un fichier, cet article est peut-être pour vous.

Obtenir une partie spécifique de la chaîne

Pour obtenir une partie spécifique d'une chaîne ou d'une sous-chaîne, utilisez le découpage.
Par exemple, récupérez la sous-chaîne de 3 à 9 à partir de la chaîne "Python c'est cool !".

s = 'Python is cool!'
substring = s[3:10]

Obtenir des clés spécifiques de Dict

Même si ce sujet relève peut-être davantage des dictionnaires, je voudrais mentionner
qu'en convertissant un dictionnaire en liste, vous obtenez une liste des clés du dictionnaire.
Et maintenant, nous revenons au sujet de l'obtention d'éléments spécifiques à partir d'une liste.

Pour des problèmes plus avancés, utilisez la méthode de dictionnaire items(). Par exemple pour récupérer tous
clés dont la valeur est une voyelle :

d = {0:'a', 1:'b', 2:'c', 3:'d', 4:'e'}
vowels = [key for key, item in d.items() if item in 'aeiou']

Apprenez tout sur les dictionnaires Python ici !

Conclusion

Si vous souhaitez obtenir des éléments spécifiques d'une liste en Python, vous avez plusieurs possibilités pour le faire.
Vous pouvez regrouper ces solutions en deux groupes :

  • Obtenir des éléments par index
    • utiliser l'opérateur [] avec l'index de l'élément
    • utiliser la méthode pop(index) de la liste
    • utilisez le découpage (lst[start:stop:step]) pour obtenir plusieurs éléments à la fois
    • utiliser la fonction itemgetter() du module opérateur
  • Obtenir des éléments par condition
    • utiliser la fonction filter()
    • utiliser une compréhension de liste

Dans tous les cas, il est important pour tout programmeur Python compétent de maîtriser ces
différentes solutions.