Come rimuovere gli zeri iniziali e finali in una stringa? Pitone


110

Ho diverse stringhe alfanumeriche come queste

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

L'output desiderato per la rimozione degli zeri finali sarebbe:

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

L'uscita desiderata per principali zeri finali sarebbe:

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

L'output desiderato per la rimozione degli zeri iniziali e finali sarebbe:

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

Per ora l'ho fatto nel modo seguente, per favore suggerisci un modo migliore se c'è:

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)

Risposte:


238

Che ne dici di un basic

your_string.strip("0")

rimuovere sia gli zeri finali che quelli iniziali? Se sei interessato solo a rimuovere gli zeri finali, usa .rstripinvece (e .lstripsolo per quelli iniziali).

[Maggiori informazioni nel documento .]

Potresti usare un po 'di comprensione dell'elenco per ottenere le sequenze che desideri in questo modo:

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]

2
C'è qualche aggiustamento intelligente per questa risposta per il caso speciale di s = '0'?
Charles

7
@Charles: Sì! Ho appena avuto lo stesso problema e puoi farlo s.strip("0") or "0": se la tua stringa si trasforma nella stringa vuota, verrà valutata come Falseda o e sarà sostituita dalla stringa desiderata"0"
tarulen

@ Pierre GM Grazie. Aiuta davvero ed è molto semplice. Voto positivo
Vishav Gupta il

18

Rimuovi "0" iniziale + finale:

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

Rimuovi lo "0" iniziale:

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

Rimuovi lo "0" finale:

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

grazie per la tua risposta. Aiuta davvero. Ho votato per favore
Vishav Gupta

7

Puoi semplicemente farlo con un bool:

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

   number = int(number)

else:

   number = float(number)

2
Non funziona alphanumeric0000come OP richiesto.
Karl Richter

4

Hai provato con strip () :

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

>>> ['231512-n', '1209123100000-n', 'alphanumeric', 'alphanumeric']

1

str.stripè l'approccio migliore per questa situazione, ma more_itertools.stripè anche una soluzione generale che rimuove sia gli elementi iniziali che quelli finali da un iterabile:

Codice

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']

Dettagli

Nota, qui eliminiamo sia il lead che il trailing "0" tra gli altri elementi che soddisfano un predicato. Questo strumento non è limitato alle stringhe.

Vedere anche la documentazione per ulteriori esempi di

more_itertoolsè una libreria di terze parti installabile tramite > pip install more_itertools.


1

Supponendo che tu abbia altri tipi di dati (e non solo stringhe) nel tuo elenco, prova questo. Ciò rimuove gli zeri finali e iniziali dalle stringhe e lascia intatti altri tipi di dati. Questo gestisce anche il caso speciale s = '0'

per esempio

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']
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.