Programmes Python sur les opérations de chaîne



Dans ce guide, vous allez concevoir des programmes en Python pour explorer les questions fréquemment posées relatives aux manipulations de chaînes de caractères.

Vous apprendrez notamment à déterminer si des chaînes en Python sont des palindromes, des anagrammes, et si elles respectent la casse de titre.

Aperçu des chaînes en Python

En Python, les chaînes sont des types de données intégrés puissants, permettant de stocker une séquence ordonnée de caractères.

L’indexation des chaînes : à l’instar des autres itérables en Python, les chaînes sont indexées à partir de zéro. Par conséquent, pour une chaîne de longueur N, les indices valides vont de 0 à N-1.

Python supporte également l’indexation négative, pour accéder aux éléments en partant de la fin de la chaîne. Ainsi, -1 correspond au dernier caractère, -2 à l’avant-dernier, et ainsi de suite.

L’immutabilité des chaînes : les chaînes en Python sont immuables, ce qui signifie qu’elles ne peuvent pas être modifiées directement. Cependant, vous pouvez invoquer diverses méthodes sur les chaînes et obtenir de nouvelles copies avec les modifications souhaitées.

Maintenant que nous avons passé en revue les fondamentaux des chaînes en Python, plongeons dans la résolution de problèmes simples, mais néanmoins intéressants.

Commençons sans plus tarder.

Identifier un palindrome en Python

Problématique : Déterminer si une chaîne donnée est un palindrome ou non.

Si c’est un palindrome, la fonction retournera True, sinon False.

Le premier défi consiste à évaluer si la chaîne fournie est un palindrome.

Un palindrome est une séquence de caractères qui se lit de la même manière dans les deux sens. Par exemple : radar, kayak, ressasser, rotor.

Voici les étapes pour résoudre ce problème :

  • Obtenez une copie inversée de la chaîne (si nécessaire, stockez-la dans une nouvelle variable).
  • Comparez la chaîne originale avec sa version inversée.
  • Si elles sont identiques, la chaîne est un palindrome. Retournez True et terminez.
  • Si les copies ne sont pas identiques, la chaîne n’est pas un palindrome. Retournez False.

L’opération cruciale est d’obtenir une copie inversée de la chaîne. Python offre plusieurs méthodes pour y parvenir.

Nous allons étudier deux approches :

  • Utilisation du découpage de chaîne.
  • Utilisation de la fonction reversed() combinée avec la méthode join().

Inverser une chaîne avec le découpage

La syntaxe [début:fin:pas] extrait une tranche de la chaîne , en partant de l’indice de début jusqu’à celui de fin (exclu), en utilisant l’incrément spécifié par le pas.

  • Si l’indice de début est omis, le découpage commence au début de la chaîne.
  • Si l’indice de fin n’est pas spécifié, la tranche s’étend jusqu’à la fin de la chaîne.
  • Un pas négatif permet de parcourir la chaîne à l’envers.

Ainsi, [::-1] renvoie une copie inversée de la chaîne.

Le code ci-dessous définit la fonction is_palindrome(), qui prend une chaîne en argument et renvoie True si c’est un palindrome, sinon False.

Nous utilisons ici le découpage de chaîne pour obtenir une version inversée.

def is_palindrome(this_str):
  rev_str = this_str[::-1]
  if (this_str == rev_str):
    return True
  else:
    return False

▶️ La fonction étant définie, nous pouvons la tester avec diverses chaînes.

is_palindrome("radar")
True

Dans cet exemple, « radar » est bien un palindrome. La fonction is_palindrome() retourne True comme attendu.

Testons maintenant avec une chaîne qui n’est pas un palindrome, comme « maison ».

is_palindrome("maison")
False

Et la fonction renvoie False, ce qui est correct. ✅

Inverser une chaîne avec reversed() et join()

En Python, la méthode join() et la fonction reversed() peuvent être combinées pour inverser une chaîne.

  • La fonction reversed() retourne un itérateur qui parcourt les caractères de la chaîne dans l’ordre inverse.
  • La méthode join() peut être employée pour concaténer ces caractères dans l’ordre inverse.

En utilisant cette méthode, la fonction is_palindrome() peut être réécrite comme suit :

def is_palindrome(this_str):
  rev_str="".join(reversed(this_str))
  if (this_str == rev_str):
    return True
  else:
    return False

Cette fonction is_palindrome() peut également être utilisée dans une compréhension de liste pour extraire tous les palindromes d’une liste de chaînes plus longue.

str_list = ["radar","bleu","rotor","12321","dragon"]

palindromes = [string for string in str_list if is_palindrome(string)]
print(palindromes)
# Output
['radar', 'rotor', '12321']

Voici le fonctionnement de ce code :

  • On parcourt str_list, et on appelle is_palindrome() sur chaque chaîne.
  • Si is_palindrome() retourne True, on ajoute la chaîne à la liste des palindromes.

Comme le montre la sortie ci-dessus, ‘palindromes’ contient toutes les chaînes palindromiques présentes dans ‘str_list’.

Déterminer si deux chaînes sont des anagrammes

Une autre question fréquemment posée en entretien est de savoir comment vérifier si deux chaînes, str1 et str2, sont des anagrammes.

Deux chaînes sont considérées comme des anagrammes si elles sont composées des mêmes caractères, peu importe leur ordre. On peut obtenir une chaîne en permutant les caractères de l’autre.

Exemples d’anagrammes : « chien » et « niche », « gare » et « rage », « paris » et « sripa ».

Vérification d’anagrammes avec l’objet Counter

Une approche simple consiste à compter le nombre d’occurrences de chaque caractère dans les deux chaînes, puis à comparer ces comptes.

L’objet Counter du module collections facilite cette tâche. L’objet Counter renvoie un dictionnaire, où les clés sont les caractères et les valeurs, leurs fréquences.

Considérons les chaînes « chat » et « tach ».

str1 = "chat"
str2 = "tach"

Ici, c1 et c2 sont des objets Counter contenant respectivement les comptes de caractères des chaînes str1 et str2.

from collections import Counter
c1 = Counter(str1)
c2 = Counter(str2)
print(c1)
print(c2)
c1 == c2

# Output
Counter({'c': 1, 'h': 1, 'a': 1, 't': 1})
Counter({'t': 1, 'a': 1, 'c': 1, 'h': 1})
True

c1 == c2 renvoie True, puisque str1 et str2 sont des anagrammes.

En suivant cette logique, nous pouvons définir la fonction are_anagrams(), prenant deux chaînes en paramètres. Cette fonction vérifiera si Counter(word1) est égal à Counter(word2).

def are_anagrams(word1, word2):
  if Counter(word1) ==  Counter(word2):
    return True
  else:
    return False

▶️ Pour tester la fonction, invoquons are_anagrams() avec les arguments str1 et str2. Puisque « chat » et « tach » sont des anagrammes, la fonction retournera True.

are_anagrams(str1, str2)
True

Vérification d’anagrammes en comparant les versions triées des chaînes

Une autre approche consiste à comparer les versions triées des chaînes.

Si deux chaînes sont des anagrammes, leurs copies triées seront identiques.

Nous pouvons donc réécrire are_anagrams() pour comparer si la version triée de str1 est égale à celle de str2. Si c’est le cas, les deux chaînes sont des anagrammes.

En utilisant cette méthode, la fonction are_anagrams() devient :

def are_anagrams(word1, word2):
  if sorted(word1) ==  sorted(word2):
    return True
  else:
    return False

Testons maintenant quelques appels de fonction.

  • Les chaînes « ecoute » et « coutee » sont des anagrammes, et la fonction are_anagrams() retourne True.
  • « paris » et « parsi » ne sont pas des anagrammes et la fonction renvoie False.
are_anagrams("ecoute","coutee")
True

are_anagrams("paris","parsi")
False

Vérifier la casse de titre

Voici notre dernière problématique de ce guide.

Problème : Étant donné un nom de personne, prénom et nom de famille.

Vous devez vérifier si la première lettre du prénom et du nom de famille est en majuscule.

Ce style où chaque mot commence par une majuscule est appelé la casse de titre.

Vous devez donc vérifier si le nom est en casse de titre :

1. Si oui, affichez un message confirmant que le nom est en casse de titre.

2. Sinon, renvoyez une copie du nom formatée en casse de titre.

  • Python dispose de la méthode de chaîne istitle(), qui vérifie si une chaîne est en casse de titre.

.istitle() retourne True si la chaîne est en casse de titre, sinon elle retourne False.

  • La méthode de chaîne title() retourne une copie de la chaîne formatée en casse de titre.

Nous pouvons utiliser ces deux méthodes pour résoudre ce problème.

Définissons une fonction check_titlecase() qui prend name en argument.

  • Appelez la méthode istitle() sur la chaîne pour vérifier si elle est en casse de titre.
  • Si True, affichez un message indiquant que la chaîne est déjà en casse de titre.
  • Sinon, appelez la méthode title() et retournez une copie de la chaîne en casse de titre.

Le code suivant montre la définition de la fonction check_titlecase().

def check_titlecase(name):
  if name.istitle():
    print(f"'{name}' est déjà en casse de titre.")
  else:
    return name.title()

Appelons maintenant la méthode check_titlecase() avec un argument.

check_titlecase("jeanne dupont")

# Output
Jeanne Dupont

Dans la sortie ci-dessus, on peut voir que la chaîne « jeanne dupont » est maintenant en casse de titre.

▶️ Prenons un autre exemple.

check_titlecase("agathe christie")

# Output
Agathe Christie

Appelons maintenant la fonction avec une chaîne déjà en casse de titre.

check_titlecase("Grace Hopper")

# Output
'Grace Hopper' est déjà en casse de titre.

Nous constatons que la chaîne est déjà en casse de titre, et que la fonction fonctionne comme prévu.

Conclusion 👩‍🏫

Récapitulons les problèmes que nous avons explorés.

  • Pour déterminer si une chaîne est un palindrome, comparez-la avec sa version inversée. Utilisez le découpage de chaîne ou des fonctions intégrées pour l’inverser.
  • Pour vérifier si deux chaînes sont des anagrammes, assurez-vous que leurs copies triées sont identiques. La fonction sorted() permet de trier une chaîne.
  • Pour vérifier si un nom est en casse de titre, utilisez la méthode .istitle() pour vérifier et la méthode .title() pour obtenir une copie en casse de titre.

J’espère que vous avez apprécié ce guide sur les chaînes en Python. Pour aller plus loin, apprenez à utiliser les compréhensions de liste en Python ou découvrez l’opérateur non égal en Python.

Bon apprentissage et bon codage !🎉