Tri Python

Le moyen le plus simple de trier consiste à utiliser la fonction trié(list), qui prend une liste et renvoie une nouvelle liste avec ces éléments dans l'ordre de tri. La liste d'origine n'est pas modifiée.

  a = [5, 1, 4, 3]
  print(sorted(a))  ## [1, 3, 4, 5]
  print(a)  ## [5, 1, 4, 3]

Il est très courant de transmettre une liste à la fonction triée(), mais elle peut en fait accepter n'importe quel type de collection itérable. L'ancienne méthode list.sort() est une alternative détaillée ci-dessous. La fonction triée() semble plus facile à utiliser par rapport à sort(), je vous recommande donc d'utiliser sort().

La fonction triée() peut être personnalisée via des arguments facultatifs. L'argument facultatif trié() est inversé=True, par exemple sort(list, reverse=True), le tri s'effectue dans l'ordre inverse.

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']

Tri personnalisé avec key=

Pour un tri personnalisé plus complexe, sort() prend une valeur "key=" spécifiant une "clé" qui transforme chaque élément avant la comparaison. La fonction clé prend une valeur et renvoie une valeur, et le "proxy" renvoyé est utilisée pour les comparaisons au sein du tri.

Par exemple, avec une liste de chaînes, spécifier key=len (la fonction len() intégrée) trie les chaînes par longueur, de la plus courte à la plus longue. Le tri appelle len() pour chaque chaîne afin d’obtenir la liste des valeurs de longueur du proxy, puis effectue un tri avec ces valeurs de proxy.

  strs = ['ccc', 'aaaa', 'd', 'bb']
  print(sorted(strs, key=len))  ## ['d', 'bb', 'ccc', 'aaaa']

appel trié avec key=len

Autre exemple : spécifier "str.lower" en tant que fonction clé est un moyen de forcer le tri à traiter les majuscules et les minuscules de la même manière:

  ## "key" argument specifying str.lower function to use for sorting
  print(sorted(strs, key=str.lower))  ## ['aa', 'BB', 'CC', 'zz']

Vous pouvez également transmettre votre propre MyFn en tant que fonction clé, comme ceci:

  ## Say we have a list of strings we want to sort by the last letter of the string.
  strs = ['xc', 'zb', 'yd' ,'wa']

  ## Write a little function that takes a string, and returns its last letter.
  ## This will be the key function (takes in 1 value, returns 1 value).
  def MyFn(s):
    return s[-1]

  ## Now pass key=MyFn to sorted() to sort by the last letter:
  print(sorted(strs, key=MyFn))  ## ['wa', 'zb', 'xc', 'yd']

Pour un tri plus complexe comme le tri par nom de famille puis par prénom, vous pouvez utiliser les fonctions itemgetter ou attrgetter, par exemple:

  from operator import itemgetter

  # (first name, last name, score) tuples
  grade = [('Freddy', 'Frank', 3), ('Anil', 'Frank', 100), ('Anil', 'Wang', 24)]
  sorted(grade, key=itemgetter(1,0))
  # [('Anil', 'Frank', 100), ('Freddy', 'Frank', 3), ('Anil', 'Wang', 24)]

  sorted(grade, key=itemgetter(0,-1))
  #[('Anil', 'Wang', 24), ('Anil', 'Frank', 100), ('Freddy', 'Frank', 3)]

Méthode sort()

Au lieu de trié(), la méthode sort() d'une liste trie cette liste dans l'ordre croissant, par exemple list.sort(). La méthode sort() modifie la liste sous-jacente et renvoie None, donc utilisez-la comme ceci:

  alist.sort()            ## correct
  alist = blist.sort()    ## Incorrect. sort() returns None

Ce qui précède est un malentendu très courant avec sort() - il *ne renvoie pas* la liste triée. La méthode sort() doit être appelée sur une liste ; elle ne fonctionne sur aucune collection énumérable (mais la fonction triée ci-dessus fonctionne sur n'importe quel élément). La méthode sort() est antérieure à la fonction triée(). Vous la verrez donc probablement dans le code plus ancien. La méthode sort() n'a pas besoin de créer une nouvelle liste. Elle peut donc être un peu plus rapide si les éléments à trier figurent déjà dans une liste.

Tuples

Un tuple est un regroupement d'éléments de taille fixe, tel qu'une coordonnée (x, y). Les tuples sont comme des listes, sauf qu'ils sont immuables et ne changent pas de taille (les tuples ne sont pas strictement immuables, car l'un des éléments contenus peut être modifiable). Les tuples jouent une sorte de "struct" en Python. Il s'agit d'un moyen pratique de transmettre un petit ensemble logique de valeurs de taille fixe. Une fonction qui doit renvoyer plusieurs valeurs peut simplement renvoyer un tuple de valeurs. Par exemple, si je voulais obtenir une liste de coordonnées à trois dimensions, la représentation Python naturelle serait une liste de tuples, où chaque tuple a une taille de 3 et contient un groupe (x, y, z).

Pour créer un tuple, il suffit de lister les valeurs entre parenthèses séparées par des virgules. L'état "vide" tuple n'est qu'une paire de parenthèses vide. L'accès aux éléments d'un tuple est identique à celui d'une liste : len(), [ ], for, in, etc. fonctionnent tous de la même manière.

  tuple = (1, 2, 'hi')
  print(len(tuple))  ## 3
  print(tuple[2])    ## hi
  tuple[2] = 'bye'  ## NO, tuples cannot be changed
  tuple = (1, 2, 'bye')  ## this works

Pour créer un tuple de taille 1, l'élément lone doit être suivi d'une virgule.

  tuple = ('hi',)   ## size-1 tuple

Il s'agit d'un cas amusant dans la syntaxe, mais la virgule est nécessaire pour distinguer le tuple du cas ordinaire consistant à placer une expression entre parenthèses. Dans certains cas, vous pouvez omettre les parenthèses : Python verra, à partir des virgules, que vous souhaitez un tuple.

L'attribution d'un tuple à un tuple de taille identique de noms de variables affecte toutes les valeurs correspondantes. Si les tuples ne sont pas de la même taille, une erreur est générée. Cette fonctionnalité est également valable pour les listes.

  (x, y, z) = (42, 13, "hike")
  print(z)  ## hike
  (err_string, err_code) = Foo()  ## Foo() returns a length-2 tuple

Lister les compréhensions (facultatif)

La compréhension des listes est une fonctionnalité plus avancée, qui est utile dans certains cas, mais qui n'est pas nécessaire pour les exercices. Vous n'avez pas besoin d'apprendre au préalable (vous pouvez donc passer cette section). La compréhension d'une liste est une méthode compacte permettant d'écrire une expression qui se transforme en liste entière. Supposons que nous ayons une liste [1, 2, 3, 4]. Voici la compréhension de la liste pour calculer la liste de leurs carrés [1, 4, 9, 16]:

  nums = [1, 2, 3, 4]

  squares = [ n * n for n in nums ]   ## [1, 4, 9, 16]

La syntaxe est [ expr for var in list ]. for var in list ressemble à une boucle "for" standard, mais sans les deux-points (:). L'expression expr à sa gauche est évaluée une fois pour chaque élément afin de fournir les valeurs de la nouvelle liste. Voici un exemple avec des chaînes, où chaque chaîne est remplacée par une majuscule avec "!!!". ajouté:

  strs = ['hello', 'and', 'goodbye']

  shouting = [ s.upper() + '!!!' for s in strs ]
  ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']

Vous pouvez ajouter un test if à droite de la boucle pour pour affiner le résultat. Le test if est évalué pour chaque élément, y compris uniquement les éléments pour lesquels le test est vrai.

  ## Select values <= 2
  nums = [2, 8, 1, 6]
  small = [ n for n in nums if n <= 2 ]  ## [2, 1]

  ## Select fruits containing 'a', change to upper case
  fruits = ['apple', 'cherry', 'banana', 'lemon']
  afruits = [ s.upper() for s in fruits if 'a' in s ]
  ## ['APPLE', 'BANANA']

Exercice: list1.py

Pour vous entraîner à utiliser cette section, essayez les problèmes ultérieurs de list1.py qui utilisent le tri et les tuples (dans les exercices de base).