Como remover zeros à esquerda e à direita em uma string? Pitão


110

Eu tenho várias strings alfanuméricas como essas

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

A saída desejada para remover os zeros finais seria:

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

A saída desejada para zeros à esquerda seria:

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

A saída desejada para remover os zeros à esquerda e à direita seria:

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

Por enquanto, estou fazendo da seguinte maneira, por favor, sugira uma maneira melhor se houver:

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)

Respostas:


238

Que tal um básico

your_string.strip("0")

remover os zeros à direita e à esquerda? Se você estiver interessado apenas em remover zeros à direita, use em .rstripvez disso (e .lstripapenas para os que estão à esquerda).

[Mais informações no documento .]

Você pode usar alguma compreensão de lista para obter as sequências que deseja, assim:

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
Existe algum ajuste inteligente para esta resposta para o caso especial de s = '0'?
Charles,

7
@Charles: Sim! Eu acabei de ter o mesmo problema, e você pode fazer s.strip("0") or "0": se sua string se transformar em uma string vazia, ela será avaliada como Falsepor ou e será substituída pela string desejada"0"
tarulen

@Pierre GM Obrigado. Isso realmente ajuda e é muito simples. Votos positivos
Gupta

18

Remover '0' inicial + final:

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

Remova o '0' inicial:

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

Remova o '0' final:

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

obrigado pela sua resposta. Isso realmente ajuda. Eu votei positivamente
Gupta

7

Você pode simplesmente fazer isso com um bool:

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

   number = int(number)

else:

   number = float(number)

2
Não funciona com alphanumeric0000o OP solicitado.
Karl Richter

4

Você tentou com 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é a melhor abordagem para essa situação, mas more_itertools.striptambém é uma solução geral que remove os elementos iniciais e finais de um iterável:

Código

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

Detalhes

Observe, aqui removemos tanto o primeiro como o final "0" s entre outros elementos que satisfazem um predicado. Esta ferramenta não se limita a strings.

Veja também os documentos para mais exemplos de

more_itertoolsé uma biblioteca de terceiros instalável via > pip install more_itertools.


1

Supondo que você tenha outros tipos de dados (e não apenas string) em sua lista, tente fazer isso. Isso remove os zeros à direita e à esquerda das strings e deixa outros tipos de dados intactos. Isso também lida com o caso especial s = '0'

por exemplo

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']
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.