8
votes

Bug dans la fonction Python Str.Rstrip () ou ma propre stupidité?

Soit ceci est un bug, ou je suis sur le point d'apprendre quelque chose de nouveau sur la façon dont le python se comporte. :)

J'ai un dictionnaire rempli de paires de clé / valeur. Chaque clé a un préfixe unique, iias_xx_xx _ code> strong>. J'essaie d'obtenir une liste de chaque préfixe unique dans le dictionnaire. P>

  1. Tout d'abord, j'ai une liste de toutes les clés qui se terminent dans '_ x1' code>. li>
  2. Suivant, je bande '_ x1' code> de tous en utilisant rstrip ('_ x1' code>). Li> OL>

    Cela fonctionne bien pour tous, sauf pour le dernier, ias_1_1_x1 code>. Au lieu d'être dépouillé vers ias_1_1 code>, il devient ias _ code>. Exécutez le code pour voir vous-même: p> xxx pré>

    sortie réelle strong>: (python 2.6, 2.7 et 3.2 (doit changer d'impression à imprimer () pour 3.x TO TRAVAIL)) P>

    ['ias_16_10_x1', 'ias_16_9_x1', 'ias_1_1_x1']
    ['ias_16_10', 'ias_16_9', 'ias_1_1']
    


2 commentaires

Dans Retrospect, il aurait peut-être été plus correct et moins déroutant si l'argument de rstrip était un ensemble au lieu d'une liste. Mais des ensembles ont été ajoutés plus tard à Python.


Vous pouvez toujours simplement trancher les trois derniers caractères: uids = [clé [: - 3] pour la clé en D si clé.endswith ("_ x1")] . Notez que endswith n'est pas le même que le test que vous avez exécuté.


6 Réponses :


20
votes

Le paramètre sur rstrip () est un ensemble de caractères à dépouiller, pas une chaîne exacte: xxx

indice général: Si vous soupçonnez un bogue Quelques fonctions, lisez son documentation .


1 commentaires

Je n'ai jamais réalisé cela! Du nom, il était facile de se mal comprendre comme enlevant la "chose" à la fin ..



5
votes

du docs , accent ajouté:

L'argument de caractères est une chaîne spécifiant l'ensemble des caractères à supprimer. Si omis ou aucun, l'argument de caractère défaut par défaut de supprimer les espaces. L'argument des caractères n'est pas un suffixe ; Plutôt, toutes les combinaisons de ses valeurs sont dépouillées.


0 commentaires

3
votes

.RStrip () supprime tous les combinaisons de caractères correspondants, pas la chaîne réelle que vous fournissez. Voir http://docs.python.org/library/sttingtypes.html .


0 commentaires

4
votes

Le paramètre de .RStrip n'est pas la chaîne que nous voulons dépouiller, ce sont les personnages que nous voulons dépouiller. Vérifiez que les exemples: xxx


0 commentaires

2
votes

Essayez ceci à la place:

unique_ids.append(re.sub('_x1$', '', x1_field)


3 commentaires

Merci. J'ai fini par utiliser unique_ids.append (x1_field.rsplit ('_ x1', 1) [0]) . Des avantages pour utiliser votre solution de regex à la place?


Pas vraiment. Optimisation prématurée peut-être? :) Mais je ne sais pas lequel est le plus rapide.


Mais je dois admettre que j'aime bien votre solution ... et sur la base de tests très rapides, cela semble être au moins deux fois plus rapide que le re seul. Notez à soi-même: Arrêtez de compter sur des expressions régulières pour tout.



0
votes

rstrip em> retourne une copie de la chaîne avec des caractères de fin supprimés. strong>

Par exemple: P>

>>> "cosmac.csv".replace(".csv")
'cosma'
>>> "cosmac.csv".replace(".csv", "")
'cosmac'


0 commentaires