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, Cela fonctionne bien pour tous, sauf pour le dernier, sortie réelle strong>: (python 2.6, 2.7 et 3.2 (doit changer d'impression à imprimer () pour 3.x TO TRAVAIL)) P> iias_xx_xx _ code> strong>. J'essaie d'obtenir une liste de chaque préfixe unique dans le dictionnaire. P>
'_ x1' code>. li>
'_ x1' code> de tous en utilisant
rstrip ('_ x1' code>). Li>
OL>
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>
['ias_16_10_x1', 'ias_16_9_x1', 'ias_1_1_x1']
['ias_16_10', 'ias_16_9', 'ias_1_1']
6 Réponses :
Le paramètre sur indice général: Si vous soupçonnez un bogue Quelques fonctions, lisez son documentation . p> p> rstrip () code> est un ensemble de caractères à dépouiller, pas une chaîne exacte:
Je n'ai jamais réalisé cela! Du nom, il était facile de se mal comprendre comme enlevant la "chose" à la fin ..
du docs , accent ajouté: p>
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 em>; Plutôt, toutes les combinaisons de ses valeurs sont dépouillées. P> blockQuote>
.RStrip () code> supprime tous les combinaisons em> de caractères correspondants, pas em> la chaîne réelle que vous fournissez. Voir http://docs.python.org/library/sttingtypes.html . p>
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:
Essayez ceci à la place:
unique_ids.append(re.sub('_x1$', '', x1_field)
Merci. J'ai fini par utiliser unique_ids.append (x1_field.rsplit ('_ x1', 1) [0]) code>. 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.
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'
Dans Retrospect, il aurait peut-être été plus correct et moins déroutant si l'argument de
rstrip code> é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")] code>. Notez que
endswith code> n'est pas le même que le test que vous avez exécuté.