web-dev-qa-db-fra.com

Trier la liste des chaînes ignorant les majuscules / minuscules

J'ai une liste qui contient des chaînes représentant des noms d'animaux. J'ai besoin de trier la liste. Si j'utilise sorted(list), cela donnera d'abord la sortie de la liste avec les chaînes majuscules, puis les minuscules.

Mais j'ai besoin de la sortie ci-dessous.

Contribution:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

Production:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
25
Darknight

La méthode sort() et la fonction sorted() prennent un argument clé:

var.sort(key=lambda v: v.upper())

La fonction nommée dans key est appelée pour chaque valeur et la valeur de retour est utilisée lors du tri, sans affecter les valeurs réelles:

>>> var=['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=lambda v: v.upper())
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

Pour trier Ant avant ant, vous devez inclure un peu plus d'informations dans la clé, afin que des valeurs autrement égales soient triées dans un ordre donné:

>>> sorted(var, key=lambda v: (v.upper(), v[0].islower()))
['Ant', 'ant', 'Bat', 'bat', 'Cat', 'cat', 'Goat', 'Lion']

La clé la plus complexe génère ('ANT', False) pour Ant et ('ANT', True) pour ant; True est trié après False et les mots en majuscule sont donc triés avant leur équivalent en minuscules.

Voir le Python sorting HOWTO pour plus d'informations.

42
Martijn Pieters

Nouvelle réponse pour Python 3, je voudrais ajouter deux points:

  1. Utilisez str.casefold pour les comparaisons non sensibles à la casse.
  2. Utilisez la méthode directement au lieu de l'intérieur d'un lambda.

C'est:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

var.sort(key=str.casefold)

(qui trie sur place) et maintenant:

>>> var
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

Ou, pour renvoyer une nouvelle liste, utilisez sorted

>>> var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=str.casefold)
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

Pourquoi est-ce différent de str.lower Ou str.upper? Selon la documentation:

Le casefolding est similaire à la minuscule mais plus agressif car il est destiné à supprimer toutes les distinctions de casse dans une chaîne. Par exemple, la lettre minuscule allemande 'ß' Équivaut à "ss". Comme il est déjà en minuscules, str.lower() ne ferait rien à 'ß'; casefold() le convertit en "ss".

16
Aaron Hall

Nous pouvons utiliser la fonction "trié" selon Python Tri de la documentation HOW TO.

a = sorted(Input, key=str.lower)print("Output1: ",a)

Output1:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
2
Ahmed

Je dois ajouter une autre réponse, car la réponse acceptée et les versions plus récentes manquent d'une chose importante:

Le tri insensible à la casse proposé ici n'est pas stable dans l'ordre des clés "égales"!

Cela signifie: Lorsque vous avez un mélange de chaînes de casse mixtes que vous souhaitez trier, vous obtenez une liste correctement triée, mais il n'est pas défini si "AbC" vient avant "aBc" ou après. Cela peut même varier entre les exécutions du même programme.

Afin d'avoir toujours la même sortie avec un ordre de chaînes par défaut stable, j'utilise la fonction suivante:

sorted(var, key=lambda v: (v.casefold(), v))

De cette façon, la clé d'origine est toujours ajoutée en tant qu'ordre de secours lorsque la version du dossier ne fournit pas de différence à trier.

2
Christian Tismer