Jak usunąć zera wiodące i końcowe w ciągu? Pyton

110

Mam kilka takich ciągów alfanumerycznych

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

Pożądanym wyjściem do usunięcia końcowych zer byłoby:

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

Sygnał wyjściowy na czołowych zer, to:

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

Chęć usunięcia zer wiodących i końcowych wyglądałaby następująco:

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

Na razie robię to w następujący sposób, proszę zasugerować lepszy sposób, jeśli jest:

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
źródło

Odpowiedzi:

238

A co z podstawowym

your_string.strip("0")

usunąć zarówno końcowe, jak i wiodące zera? Jeśli chcesz tylko usunąć końcowe zera, użyj .rstripzamiast tego (i .lstriptylko dla wiodących).

[Więcej informacji w doc .]

Możesz użyć rozumienia list, aby uzyskać sekwencje, które chcesz:

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
źródło
2
Czy jest jakieś sprytne dostosowanie tej odpowiedzi w szczególnym przypadku s = '0'?
Charles,
8
@Charles: Tak! Po prostu miałem ten sam problem i możesz zrobić s.strip("0") or "0": jeśli twój ciąg zamieni się w pusty ciąg, zostanie on oceniony jako Falseprzez lub i zostanie zastąpiony żądanym ciągiem"0"
tarulen
@Pierre GM Dziękuję. To naprawdę pomaga i jest bardzo proste. Głosował za tym
Vishav Gupta
18

Usuń wiodące + końcowe „0”:

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

Usuń wiodące „0”:

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

Usuń końcowe „0”:

list = [ i.rstrip('0') for i in listOfNum ]
fho
źródło
Dziękuję za odpowiedź. To naprawdę pomaga. Głosowałem za tym
Vishav Gupta
7

Możesz to po prostu zrobić za pomocą bool:

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

   number = int(number)

else:

   number = float(number)
Bjarne
źródło
2
Nie działa z alphanumeric0000żądaniem OP.
Karl Richter
4

Czy próbowałeś z stripem () :

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

>>> ['231512-n', '1209123100000-n', 'alphanumeric', 'alphanumeric']
Cédric Julien
źródło
1

str.stripjest najlepszym podejściem do tej sytuacji, ale more_itertools.stripjest również rozwiązaniem ogólnym, które usuwa zarówno elementy początkowe, jak i końcowe z iterowalnego:

Kod

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

Detale

Zauważ, że tutaj usuwamy zarówno początkowe, jak i końcowe "0"s spośród innych elementów, które spełniają predykat. To narzędzie nie jest ograniczone do łańcuchów.

Zobacz także dokumentację, aby uzyskać więcej przykładów

more_itertoolsjest biblioteką innej firmy, którą można zainstalować za pośrednictwem > pip install more_itertools.

pylang
źródło
1

Zakładając, że masz na liście inne typy danych (i nie tylko ciąg), spróbuj tego. To usuwa końcowe i wiodące zera z ciągów i pozostawia inne typy danych nietknięte. Obsługuje to również specjalny przypadek s = „0”

na przykład

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

escha
źródło