Quel est le moyen le plus simple de comparer des chaînes de caractères en Python, en ignorant la casse ?
Bien sûr, on peut faire (str1.lower() <= str2.lower()), etc., mais cela crée deux chaînes temporaires supplémentaires (avec les surcoûts évidents d'allocation/de gestion).
Je suppose que je cherche un équivalent de stricmp() en C.
[Un peu plus de contexte est nécessaire, donc je vais démontrer avec un exemple trivial :]
Supposons que vous vouliez trier une longue liste de chaînes de caractères. Il suffit de faire theList.sort(). Cela représente O(n * log(n)) comparaisons de chaînes et aucune gestion de la mémoire (puisque toutes les chaînes et tous les éléments de la liste sont des pointeurs intelligents). chaînes de caractères et les éléments de la liste sont des sortes de pointeurs intelligents). Vous êtes heureux.
Maintenant, vous voulez faire la même chose, mais en ignorant la casse (simplifions et disons que toutes les chaînes de caractères sont en ascii, ce qui permet d'ignorer les problèmes de locale). Vous pouvez faire theList.sort(key=lambda s : s.lower()), mais alors vous provoquez deux nouvelles deux nouvelles allocations par comparaison, en plus de charger le collecteur de déchets avec les chaînes (abaissées) dupliquées. Chacun de ces bruits de gestion de la mémoire est plus lent que la simple comparaison de chaînes de caractères.
Maintenant, avec une fonction in-place de type stricmp(), vous pouvez faire : theList.sort(cmp=stricmp) et c'est aussi rapide et aussi facile à mémoriser que theList.sort(). Vous êtes à nouveau heureux.
Le problème est que toute comparaison insensible à la casse basée sur Python implique une chaîne de caractères implicite. donc je m'attendais à trouver une comparaison basée sur le C (peut-être dans le module string).
Je n'ai rien trouvé de tel, d'où ma question ici. (J'espère que cela clarifie la question).
0 votes
Php Equivalent : strcasecmp - nl3.php.net/strcasecmp
4 votes
Vos hypothèses sont fausses. list.sort() avec une clé= fait pas signifie "deux nouvelles allocations par comparaison". (list.sort avec le cmp=, d'autre part fait appeler l'argument pour chaque comparaison)
0 votes
A tenté de renommer la question de
Ignore case in python strings
àWhat's closest to stricmp in Python for 7-bit ascii string comparison?
pour refléter plus précisément la question réelle de l'op. principal problème : l'unicode est aussi une "chaîne", mais cette question leur permettrait d'obtenir une réponse. totalement faux ; voir les commentaires de tchrist0 votes
Liés : Comment plier une chaîne en cascade en Python 2 ?