2012-10-12 171 views

Respuesta

100

Que este trabajar para su situación?

>>> s = '12abcd405' 
>>> result = ''.join([i for i in s if not i.isdigit()]) 
>>> result 
'abcd' 

Esto hace uso de una lista por comprensión, y lo que está sucediendo aquí es similar a esta estructura:

no_digits = [] 
# Iterate through the string, adding non-numbers to the no_digits list 
for i in s: 
    if not i.isdigit(): 
     no_digits.append(i) 

# Now join all elements of the list with '', 
# which puts all of the characters together. 
result = ''.join(no_digits) 

Como @AshwiniChaudhary y @KirkStrauser señalan, que en realidad no es necesario utilizar el corchetes en el delineador, haciendo que la pieza entre paréntesis sea una expresión del generador (más eficiente que una lista de comprensión). Incluso si esto no se ajusta a los requisitos para su asignación, es algo que usted debe leer sobre el tiempo :):

>>> s = '12abcd405' 
>>> result = ''.join(i for i in s if not i.isdigit()) 
>>> result 
'abcd' 
+0

aprendido una nueva cadena funciona hoy, gracias rocketdonkey! –

+0

@SeanJohnson ¡Impresionante! Estoy seguro de que lo aprendí de otra persona en este sitio, por lo que el ciclo está completo :) – RocketDonkey

+0

@RocketDonkey no es necesario '[]' –

2

Me encanta usar expresiones regulares para lograr esto, pero ya que sólo se puede utilizar listas, bucles, funciones, etc ..

esto es lo que ocurrió:

stringWithNumbers="I have 10 bananas for my 5 monkeys!" 
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers) 
print(stringWithoutNumbers) #I have bananas for my monkeys! 
1

Si entiendo su pregunta correcta, una forma de hacerlo es romper la cadena de caracteres y a continuación, comprobar cada caracter en esa cadena usando un bucle si se trata de una cadena o un número y luego si la cadena guardarlo en una variable y luego una vez finalizado el ciclo, muestra que para el usuario

+0

Un bucle for itera automáticamente a través de cada carácter de una cadena, por lo que no es necesario dividir la cadena en caracteres. –

3

Qué tal esto:

out_string = filter(lambda c: not c.isdigit(), in_string) 
2

Say st es la cadena sin formato, luego ejecuta

st_nodigits=''.join(i for i in st if i.isalpha()) 

como se menciona arriba. Pero mi suposición de que se necesita algo muy simple por lo que dicen s es la cadena de y st_res es una cadena sin dígitos, entonces aquí es su código

l = ['0','1','2','3','4','5','6','7','8','9'] 
st_res="" 
for ch in s: 
if ch not in l: 
    st_res+=ch 
12

No estoy seguro si su profesor le permite utilizar filtros, pero ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h") 

VUELTA a

'aaasdffgh' 

Mucho más eficiente que el bucle ...

Ejemplo:

for i in range(10): 
    a.replace(str(i),'') 
2

Sólo unos pocos (otros han sugerido algunos de estos)

Método 1:

''.join(i for i in myStr if not i.isdigit()) 

Método 2:

def removeDigits(s): 
    answer = [] 
    for char in s: 
     if not char.isdigit(): 
      answer.append(char) 
    return ''.join(char) 

Método 3:

''.join(filter(lambda x: not x.isdigit(), mystr)) 

Método 4:

nums = set(map(int, range(10))) 
''.join(i for i in mystr if i not in nums) 

Método 5:

''.join(i for i in mystr if ord(i) not in range(48, 58)) 
+1

Valdría la pena mostrar una comparación de eficiencia en estos. –

65

Y, solo para arrojarlo en la mezcla, es la tantas veces olvidado str.translate que funcionará mucho más rápido que el bucle/expresiones regulares:

Para Python 2:

from string import digits 

s = 'abc123def456ghi789zero0' 
res = s.translate(None, digits) 
# 'abcdefghizero' 

Para Python 3:

from string import digits 

s = 'abc123def456ghi789zero0' 
remove_digits = str.maketrans('', '', digits) 
res = s.translate(remove_digits) 
# 'abcdefghizero' 
+2

¡Simplemente increíble! No sabía eso. – JayJay123

+9

Este enfoque no funcionará en Python3. Haga en cambio: ''abc123def456ghi789zero0'.translate ({ord (k): Ninguno para k en dígitos})' – valignatev

+2

La mejor solución para Python2. –

Cuestiones relacionadas