Wie entferne ich führende und nachfolgende Nullen in einer Zeichenfolge? Python


110

Ich habe mehrere alphanumerische Zeichenfolgen wie diese

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

Die gewünschte Ausgabe zum Entfernen von nachgestellten Nullen wäre:

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

Die gewünschte Ausgabe für führende nachfolgende Nullen wäre:

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

Die Wunschausgabe zum Entfernen sowohl führender als auch nachfolgender Nullen wäre:

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

Im Moment mache ich es folgendermaßen, bitte schlagen Sie einen besseren Weg vor, wenn es einen gibt:

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)

Antworten:


238

Was ist mit einem Basic

your_string.strip("0")

um sowohl nachfolgende als auch führende Nullen zu entfernen? Wenn Sie nur nachfolgende Nullen entfernen möchten, verwenden Sie .rstripstattdessen (und.lstrip nur für die führenden).

[Weitere Informationen im Dokument .]

Sie können ein Listenverständnis verwenden, um die gewünschten Sequenzen zu erhalten:

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
Gibt es eine clevere Anpassung für diese Antwort für den Sonderfall von s = '0'?
Charles

7
@ Charles: Ja! Ich hatte gerade das gleiche Problem, und Sie können es tun s.strip("0") or "0": Wenn sich Ihre Zeichenfolge in eine leere Zeichenfolge verwandelt, wird sie als Falsedurch oder ausgewertet und durch die gewünschte Zeichenfolge ersetzt"0"
tarulen

@ Pierre GM Danke. Es hilft wirklich und es ist sehr einfach. Upvoted it
Vishav Gupta

18

Entfernen Sie die führende + nachfolgende '0':

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

Entfernen Sie die führende '0':

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

Entfernen Sie die nachfolgende '0':

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

Danke für deine Antwort. Es hilft wirklich. Ich habe es positiv bewertet
Vishav Gupta

7

Sie können dies einfach mit einem Bool tun:

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

   number = int(number)

else:

   number = float(number)

2
Funktioniert nicht mit alphanumeric0000dem angeforderten OP.
Karl Richter

4

Hast du es mit strip () versucht :

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

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

1

str.stripist der beste Ansatz für diese Situation, aber more_itertools.stripauch eine allgemeine Lösung, bei der sowohl führende als auch nachfolgende Elemente von einem iterierbaren Element entfernt werden:

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

Einzelheiten

Beachten Sie, dass wir hier sowohl führende als auch nachfolgende entfernen "0" s unter anderen Elementen entfernen, die ein Prädikat erfüllen. Dieses Tool ist nicht auf Zeichenfolgen beschränkt.

Weitere Beispiele für finden Sie in den Dokumenten

more_itertoolsist eine Drittanbieter-Bibliothek, die über installiert werden kann > pip install more_itertools.


1

Angenommen, Sie haben andere Datentypen (und nicht nur Zeichenfolgen) in Ihrer Liste, versuchen Sie dies. Dadurch werden nachfolgende und führende Nullen aus Zeichenfolgen entfernt und andere Datentypen bleiben unberührt. Dies behandelt auch den Sonderfall s = '0'

z.B

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']
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.