Comment supprimer les zéros de début et de fin dans une chaîne? Python

110

J'ai plusieurs chaînes alphanumériques comme celles-ci

listOfNum = ['000231512-n','1209123100000-n00000','alphanumeric0000', '000alphanumeric']

La sortie souhaitée pour supprimer les zéros de fin serait:

listOfNum = ['000231512-n','1209123100000-n','alphanumeric', '000alphanumeric']

La sortie souhaitée pour les zéros de fin de tête serait:

listOfNum = ['231512-n','1209123100000-n00000','alphanumeric0000', 'alphanumeric']

Le résultat souhaité pour supprimer les zéros de début et de fin serait:

listOfNum = ['231512-n','1209123100000-n', 'alphanumeric', 'alphanumeric']

Pour l'instant, je le fais de la manière suivante, veuillez suggérer une meilleure façon s'il y a:

listOfNum = ['000231512-n','1209123100000-n00000','alphanumeric0000', \
'000alphanumeric']
trailingremoved = []
leadingremoved = []
bothremoved = []

# Remove trailing
for i in listOfNum:
  while i[-1] == "0":
    i = i[:-1]
  trailingremoved.append(i)

# Remove leading
for i in listOfNum:
  while i[0] == "0":
    i = i[1:]
  leadingremoved.append(i)

# Remove both
for i in listOfNum:
  while i[0] == "0":
    i = i[1:]
  while i[-1] == "0":
    i = i[:-1]
  bothremoved.append(i)
alvas
la source

Réponses:

238

Qu'en est-il un basique

your_string.strip("0")

supprimer les zéros de fin et de début? Si vous ne souhaitez supprimer que les zéros de fin, utilisez à la .rstripplace (et .lstripuniquement pour les premiers).

[Plus d'infos dans le doc .]

Vous pouvez utiliser une compréhension de liste pour obtenir les séquences que vous voulez comme ceci:

trailing_removed = [s.rstrip("0") for s in listOfNum]
leading_removed = [s.lstrip("0") for s in listOfNum]
both_removed = [s.strip("0") for s in listOfNum]
Pierre GM
la source
2
Y a-t-il un ajustement intelligent pour cette réponse pour le cas particulier de s = '0'?
Charles
8
@Charles: Oui! J'ai juste eu le même problème, et vous pouvez le faire s.strip("0") or "0": si votre chaîne se transforme en chaîne vide, elle sera évaluée comme Falsepar ou et sera remplacée par la chaîne souhaitée"0"
tarulen
@Pierre GM Merci. Cela aide vraiment et c'est très simple. J'ai voté pour
Vishav Gupta
18

Supprimez les '0' de début et de fin:

list = [i.strip('0') for i in listOfNum ]

Supprimer le premier «0»:

list = [ i.lstrip('0') for i in listOfNum ]

Supprimer le «0» à la fin:

list = [ i.rstrip('0') for i in listOfNum ]
fho
la source
Merci pour votre réponse. Cela aide vraiment. Je l'ai voté pour
Vishav Gupta
7

Vous pouvez simplement le faire avec un booléen:

if int(number) == float(number):

   number = int(number)

else:

   number = float(number)
Bjarne
la source
2
Ne fonctionne pas avec l' alphanumeric0000OP demandé.
Karl Richter
4

Avez-vous essayé avec strip () :

listOfNum = ['231512-n','1209123100000-n00000','alphanumeric0000', 'alphanumeric']
print [item.strip('0') for item in listOfNum]

>>> ['231512-n', '1209123100000-n', 'alphanumeric', 'alphanumeric']
Cédric Julien
la source
1

str.stripest la meilleure approche pour cette situation, mais more_itertools.stripc'est aussi une solution générale qui supprime les éléments de début et de fin d'un itérable:

Code

import more_itertools as mit


iterables = ["231512-n\n","  12091231000-n00000","alphanum0000", "00alphanum"]
pred = lambda x: x in {"0", "\n", " "}
list("".join(mit.strip(i, pred)) for i in iterables)
# ['231512-n', '12091231000-n', 'alphanum', 'alphanum']

Détails

Remarquez, ici, nous supprimons les "0"s de début et de fin parmi d'autres éléments qui satisfont un prédicat. Cet outil n'est pas limité aux chaînes.

Voir aussi la documentation pour plus d'exemples de

more_itertoolsest une bibliothèque tierce installable via > pip install more_itertools.

pylang
la source
1

En supposant que vous ayez d'autres types de données (et pas seulement des chaînes) dans votre liste, essayez ceci. Cela supprime les zéros de fin et de début des chaînes et laisse les autres types de données intacts. Cela gère également le cas spécial s = '0'

par exemple

a = ['001', '200', 'akdl00', 200, 100, '0']

b = [(lambda x: x.strip('0') if isinstance(x,str) and len(x) != 1 else x)(x) for x in a]

b
>>>['1', '2', 'akdl', 200, 100, '0']
échapper
la source