2010-11-10 5 views
4

Essayez de supprimer le "0b1" de l'extrémité gauche d'un nombre binaire.Est-ce un bug dans Python 2.7?

Le code suivant entraîne l'effacement de tous les objets binaires. (Pas bon)

>>> bbn = '0b1000101110100010111010001' #converted bin(2**24+**2^24/11) 
>>> aan=bbn.lstrip("0b1") #Try stripping all left-end junk at once. 
>>> print aan #oops all gone. 
'' 

Je ne le .lstrip() en deux étapes:

>>> bbn = '0b1000101110100010111010001' # Same fraction expqansion 
>>> aan=bbn.lstrip("0b")# Had done this before. 
>>> print aan #Extra "1" still there. 
'1000101110100010111010001' 
>>> aan=aan.lstrip("1")# If at first you don't succeed... 
>>> print aan #YES! 
'000101110100010111010001' 

Quel est le problème?

Merci encore d'avoir résolu ce problème en une seule étape. (voir ma question précédente)

+2

[Lire la documentation aide] (http://docs.python.org/library/stdtypes.html#str.lstrip);): * L'argument chars n'est pas un préfixe; plutôt, toutes les combinaisons de ses valeurs sont supprimées. * –

+0

Similaire à Pourquoi str.lstrip bande un caractère supplémentaire? http://stackoverflow.com/questions/1687171/why-does-str-lstrip-strips-an-extra-character –

Répondre

13

La famille de bandes traite l'argument en tant que défini des caractères à supprimer. L'ensemble par défaut est "tous les caractères d'espaces".

Vous voulez:

if strg.startswith("0b1"): 
    strg = strg[3:] 
+0

Oui, mais pourquoi seulement le premier "1" dans le second cas? – Harryooo

+0

@Harryooo: Une question pour vous: Pourquoi Python a-t-il à la fois un lstrip et un rstrip ainsi qu'une bande qui combine la fonctionnalité lstrip et rstrip? –

12

Non. Le stripping supprime tous les caractères de la séquence transmise, pas seulement la séquence littérale. Tranche la chaîne si vous souhaitez supprimer une longueur fixe.

+0

Par exemple, '' ababbbbbbaaccc ".lstrip (" ab ") =>" ccc "' –

+0

I En quelque sorte figuré que lstrip() utilisait char comme une liste, mais ensuite j'ai été surpris à nouveau quand lstrip ("1") a seulement éliminé le premier "1" et pas le reste. – Harryooo

+1

C'est parce qu'il n'y avait qu'un seul '1 'sur la gauche. –

0

C'est ainsi que fonctionne lstrip. Il supprime des caractères du paramètre, pas nécessairement la chaîne dans son ensemble. Dans le premier exemple, puisque l'entrée ne comprenait que ces caractères, il ne restait plus rien.

+0

Oui, mais pourquoi seulement le premier "1" dans le second cas? – Harryooo

+0

@Harryooo, dans votre deuxième exemple 'lstrip (" 1 ")' supprime les caractères sur la gauche jusqu'à ce qu'il atteigne quelque chose qui n'est pas un '1'. Si cela avait commencé avec "1111", il les aurait tous supprimés. –

0

Lstrip supprime l'un des caractères de la chaîne. Donc, ainsi que le 0b1 initial, il supprime tous les zéros et tous les uns. D'où tout est parti!

+0

Oui, mais pourquoi seulement le premier "1" dans le second cas? – Harryooo

0

@Harryooo: lstrip supprime uniquement les caractères de l'extrémité gauche. Donc, parce qu'il n'y en a qu'un 1 avant le premier 0, il l'enlève. Si le numéro a commencé 0b11100101..., l'appel a.strip('0b').strip('1') supprimerait les trois premiers, de sorte que vous resteriez avec 00101.

Questions connexes