Recherche de valeurs dans les listes, tuples et dictionnaires Python

Apprenez a rechercher des elements dans les sequences Python : methode index(), mot-cle in, recherche dans les dictionnaires et algorithme bisect pour listes triees.

Mahmoud DEVO
Mahmoud DEVO
December 27, 2025 7 min read
Recherche de valeurs dans les listes, tuples et dictionnaires Python

Recherche de Valeurs dans les Sequences en Python

Introduction

La recherche de valeurs dans les sequences est une operation fondamentale que tout developpeur Python rencontre quotidiennement. Que vous construisiez une application web, analysiez des donnees ou developpiez des scripts d’automatisation, savoir rechercher efficacement des elements dans vos structures de donnees est essentiel pour ecrire du code performant et maintenable.

Python offre plusieurs structures de donnees sequentielles - listes, tuples, dictionnaires - chacune avec ses propres methodes et techniques de recherche. Comprendre quand utiliser quelle methode peut faire la difference entre un programme qui s’execute en millisecondes et un qui prend des secondes, voire des minutes sur de grands ensembles de donnees.

Dans ce tutoriel complet, nous allons explorer les differentes methodes pour rechercher des elements dans les sequences Python, des techniques de base aux approches optimisees pour les grandes collections. Vous apprendrez non seulement comment utiliser ces methodes, mais aussi quand les utiliser et quels pieges eviter.

Recherche d’elements dans les listes

Les listes sont l’un des types de sequences les plus courants en Python. Pour rechercher un element dans une liste, vous pouvez utiliser la methode index() ou le mot-cle in.

Utilisation du mot-cle in

Le mot-cle in est la methode la plus simple et lisible pour verifier si un element existe dans une liste :

my_list = [1, 2, 3, 4, 5]
print(5 in my_list)  # True
print(10 in my_list)  # False

# Utilisation dans une condition
if "python" in ["java", "python", "javascript"]:
    print("Python est dans la liste !")

Utilisation de la methode index()

La methode index() retourne l’index de l’element si il est trouve. Si l’element n’est pas trouve, elle souleve une erreur ValueError :

my_list = [1, 2, 3, 4, 5]
print(my_list.index(3))  # 2 (l'index commence a 0)

# Attention : ValueError si l'element n'existe pas
print(my_list.index(6))  # ValueError: 6 is not in list

Recherche avec parametres start et end

La methode index() accepte des parametres optionnels pour limiter la recherche :

my_list = [1, 2, 3, 2, 4, 2, 5]

# Rechercher a partir de l'index 2
print(my_list.index(2, 2))  # 3 (premiere occurrence apres index 2)

# Rechercher entre les index 4 et 6
print(my_list.index(2, 4, 7))  # 5

Trouver toutes les occurrences

Pour trouver tous les index d’un element, utilisez une comprehension de liste :

my_list = [1, 2, 3, 2, 4, 2, 5]
indices = [i for i, x in enumerate(my_list) if x == 2]
print(indices)  # [1, 3, 5]

Il est important de noter que la methode index() retourne l’index de l’element le plus a gauche qui correspond a la valeur recherchee.

Recherche d’elements dans les tuples

Les tuples sont similaires aux listes, mais ils sont immuables. Cela signifie que vous ne pouvez pas modifier un tuple une fois qu’il a ete cree. Cette immutabilite les rend ideaux pour stocker des donnees qui ne doivent pas changer.

my_tuple = (1, 2, 3, 4, 5)
print(5 in my_tuple)  # True
print(10 in my_tuple)  # False

La methode index() fonctionne de la meme maniere pour les tuples que pour les listes :

my_tuple = ("pomme", "banane", "orange", "banane")

# Trouver l'index d'un element
print(my_tuple.index("orange"))  # 2

# Compter les occurrences
print(my_tuple.count("banane"))  # 2

Tuples nommes (namedtuple)

Pour des recherches plus semantiques, les tuples nommes offrent une syntaxe plus claire :

from collections import namedtuple

Personne = namedtuple('Personne', ['nom', 'age', 'ville'])
personnes = [
    Personne("Alice", 30, "Paris"),
    Personne("Bob", 25, "Lyon"),
    Personne("Charlie", 35, "Paris")
]

# Rechercher par attribut
parisiens = [p for p in personnes if p.ville == "Paris"]
print(parisiens)  # [Personne(nom='Alice', ...), Personne(nom='Charlie', ...)]

Recherche d’elements dans les dictionnaires

Les dictionnaires sont une structure de donnees puissante qui utilise des cles pour acceder aux valeurs. La recherche dans les dictionnaires est tres rapide (O(1) en moyenne) grace a leur implementation basee sur les tables de hachage.

Recherche de cles

La recherche de cles est l’operation la plus courante et la plus efficace :

my_dict = {'nom': 'Alice', 'age': 30, 'ville': 'Paris'}

# Verifier si une cle existe
print('nom' in my_dict)  # True
print('email' in my_dict)  # False

# Obtenir une valeur avec get() (evite les erreurs)
print(my_dict.get('nom'))  # Alice
print(my_dict.get('email', 'Non trouve'))  # Non trouve

Recherche de valeurs

Pour rechercher une valeur et obtenir sa cle, vous pouvez creer une fonction :

def get_keys_for_value(dictionary, value):
    found_keys = []
    for key in dictionary:
        if dictionary[key] == value:
            found_keys.append(key)
    return found_keys

my_dict = {'a': 1, 'b': 2, 'c': 1, 'd': 3}
print(get_keys_for_value(my_dict, 1))  # ['a', 'c']

Version avec comprehension de liste

Cette fonction peut etre reecrite de maniere plus concise :

def get_keys_for_value(dictionary, value):
    return [k for k, v in dictionary.items() if v == value]

# Ou pour obtenir la premiere cle seulement
def get_first_key_for_value(dictionary, value):
    return next((k for k, v in dictionary.items() if v == value), None)

my_dict = {'a': 1, 'b': 2, 'c': 1}
print(get_first_key_for_value(my_dict, 1))  # 'a'

Recherche dans des dictionnaires imbriques

Pour les structures complexes, une recherche recursive est necessaire :

def search_nested_dict(dictionary, target_key):
    """Recherche une cle dans un dictionnaire imbrique."""
    if target_key in dictionary:
        return dictionary[target_key]

    for value in dictionary.values():
        if isinstance(value, dict):
            result = search_nested_dict(value, target_key)
            if result is not None:
                return result
    return None

data = {
    'utilisateur': {
        'profil': {
            'nom': 'Alice',
            'email': 'alice@example.com'
        }
    }
}
print(search_nested_dict(data, 'email'))  # alice@example.com

Recherche d’elements dans les sequences triees

Les sequences triees peuvent utiliser des algorithmes de recherche beaucoup plus rapides que la recherche lineaire. Le module bisect implemente la recherche binaire (dichotomique), reduisant la complexite de O(n) a O(log n).

Recherche binaire avec bisect

import bisect

def index_sorted(sorted_seq, value):
    """Recherche un element dans une sequence triee."""
    i = bisect.bisect_left(sorted_seq, value)
    if i != len(sorted_seq) and sorted_seq[i] == value:
        return i
    raise ValueError(f"{value} n'est pas dans la sequence")

my_list = [i for i in range(1, 100000, 3)]
print(index_sorted(my_list, 97285))  # 32428

Comparaison des performances

La difference de performance est significative sur de grandes listes :

import bisect
import time

# Creer une grande liste triee
grande_liste = list(range(1000000))

# Recherche lineaire (index)
start = time.time()
grande_liste.index(999999)
print(f"index(): {time.time() - start:.6f}s")

# Recherche binaire (bisect)
start = time.time()
bisect.bisect_left(grande_liste, 999999)
print(f"bisect: {time.time() - start:.6f}s")

# Resultats typiques :
# index(): 0.015000s
# bisect: 0.000001s

Insertion dans une liste triee

Le module bisect permet aussi d’inserer des elements tout en maintenant l’ordre :

import bisect

scores = [10, 20, 30, 40, 50]
bisect.insort(scores, 25)
print(scores)  # [10, 20, 25, 30, 40, 50]

Bonnes Pratiques

Voici les recommandations essentielles pour optimiser vos recherches en Python :

1. Choisissez la bonne structure de donnees

# Si vous faites beaucoup de recherches, utilisez un set ou un dict
# Recherche O(1) vs O(n) pour une liste

# Mauvais : recherche dans une liste
utilisateurs = ["alice", "bob", "charlie"]
if "alice" in utilisateurs:  # O(n)
    pass

# Bon : recherche dans un set
utilisateurs_set = {"alice", "bob", "charlie"}
if "alice" in utilisateurs_set:  # O(1)
    pass

2. Verifiez l’existence avant d’utiliser index()

# Mauvais : peut lever une exception
try:
    idx = ma_liste.index(element)
except ValueError:
    idx = -1

# Bon : verifier d'abord avec 'in'
if element in ma_liste:
    idx = ma_liste.index(element)
else:
    idx = -1

3. Utilisez get() pour les dictionnaires

# Mauvais : peut lever KeyError
valeur = mon_dict["cle_inexistante"]

# Bon : utiliser get() avec valeur par defaut
valeur = mon_dict.get("cle_inexistante", "valeur_defaut")

4. Preferez les comprehensions pour les recherches multiples

# Mauvais : boucle explicite
resultats = []
for item in ma_liste:
    if condition(item):
        resultats.append(item)

# Bon : comprehension de liste
resultats = [item for item in ma_liste if condition(item)]

5. Utilisez bisect pour les listes triees volumineuses

Pour toute liste triee de plus de quelques centaines d’elements, bisect sera significativement plus rapide que index().

Pieges Courants

1. Confusion entre recherche de cle et de valeur dans les dictionnaires

mon_dict = {'a': 1, 'b': 2}

# ATTENTION : 'in' cherche dans les CLES, pas les valeurs
print(1 in mon_dict)  # False (1 n'est pas une cle)
print('a' in mon_dict)  # True

# Pour chercher dans les valeurs
print(1 in mon_dict.values())  # True

2. Modification d’une liste pendant l’iteration

# MAUVAIS : resultat imprevisible
ma_liste = [1, 2, 3, 4, 5]
for item in ma_liste:
    if item % 2 == 0:
        ma_liste.remove(item)  # Ne fait pas ce que vous pensez !

# BON : creer une nouvelle liste
ma_liste = [item for item in ma_liste if item % 2 != 0]

3. Oublier que index() ne retourne que la premiere occurrence

ma_liste = [1, 2, 3, 2, 4, 2]
print(ma_liste.index(2))  # 1 (pas 3 ni 5)

# Pour toutes les occurrences
indices = [i for i, x in enumerate(ma_liste) if x == 2]
print(indices)  # [1, 3, 5]

4. Ne pas gerer le cas “element non trouve”

# MAUVAIS : crash si l'element n'existe pas
def trouver_utilisateur(liste, nom):
    return liste.index(nom)

# BON : gestion propre du cas d'erreur
def trouver_utilisateur(liste, nom):
    try:
        return liste.index(nom)
    except ValueError:
        return None

Conclusion

La recherche d’elements dans les sequences Python est une competence fondamentale qui impacte directement les performances de vos applications. Voici les points cles a retenir :

  • Listes et tuples : Utilisez in pour verifier l’existence et index() pour obtenir la position
  • Dictionnaires : La recherche de cles est O(1), privilegiez cette structure pour les recherches frequentes
  • Grandes collections triees : Le module bisect offre des performances O(log n) contre O(n) pour index()
  • Sets : Ideaux pour les tests d’appartenance frequents avec O(1)

Le choix de la methode depend toujours du contexte : taille des donnees, frequence des recherches, et si les donnees sont triees ou non. En maitrisant ces techniques, vous ecrirez du code Python plus efficace et plus maintenable.

Exercices Pratiques

  1. Ecrivez une fonction safe_index(liste, element) qui retourne l’index d’un element ou None s’il n’existe pas.

  2. Creez une fonction qui recherche un mot dans une liste de phrases et retourne toutes les phrases contenant ce mot.

  3. Implementez une fonction de recherche floue qui trouve les elements d’une liste commencant par un prefixe donne.

  4. Comparez les performances de recherche entre une liste, un set et un dictionnaire sur 100 000 elements. Mesurez le temps pour 1000 recherches aleatoires.

Advertisement

In-Article Ad

Dev Mode

Share this article

Mahmoud DEVO

Mahmoud DEVO

Senior Full-Stack Developer

I'm a passionate full-stack developer with 10+ years of experience building scalable web applications. I write about Vue.js, Node.js, PostgreSQL, and modern DevOps practices.

Enjoyed this article?

Subscribe to get more tech content delivered to your inbox.

Related Articles