Eliminar consonantes de una cadena en Python
string list (3)
Corrigiendo tu código
La línea
if char == vowels:
está mal.
Tiene que ser
if char in vowels:
Esto se debe a que debe verificar si ese carácter en particular está presente en la lista de vocales.
Aparte de eso, debe
print(char,end = '''')
(en python3) para imprimir la salida como
iiii
todo en una línea.
El programa final será como
def eliminate_consonants(x):
vowels= [''a'',''e'',''i'',''o'',''u'']
for char in x:
if char in vowels:
print(char,end = "")
eliminate_consonants(''mississippi'')
Y la salida será
iiii
Otras formas incluyen
-
Usando
in
una cadenadef eliminate_consonants(x): for char in x: if char in ''aeiou'': print(char,end = "")
Tan simple como parece, la declaración
if char in ''aeiou''
verifica sichar
está presente en la cadenaaeiou
. -
''''.join([c for c in x if c in ''aeiou''])
Esta comprensión de la lista devolverá una lista que contendrá los caracteres solo si el personaje está en
aeiou
-
''''.join(c for c in x if c in ''aeiou'')
Este gen exp devolverá un generador que devolverá los caracteres solo si el personaje está en
aeiou
-
Puede usar
re.findall
para descubrir solo las vocales en su cadena. El códigore.findall(r''[aeiou]'',"mississippi")
devolverá una lista de vocales encontradas en la cadena, es decir,
[''i'', ''i'', ''i'', ''i'']
. Así que ahora podemos usarstr.join
y luego usar''''.join(re.findall(r''[aeiou]'',"mississippi"))
-
Para esta técnica, deberá almacenar un mapa que coincida con cada una de las no vocales con un tipo
None
. Para esto puede usarstring.ascii_lowecase
. El código para hacer el mapa esstr.maketrans({i:None for i in string.ascii_lowercase if i not in "aeiou"})
Esto devolverá la asignación. Guárdelo en una variable (aquí
m
para el mapa)"mississippi".translate(m)
Esto eliminará todos los caracteres no
aeiou
de la cadena. -
Usando
dict.fromkeys
Puede usar
dict.fromkeys
junto consys.maxunicode
. ¡Pero recuerdeimport sys
primero!dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in ''aeiou'')
y ahora usa
str.translate
.''mississippi''.translate(m)
-
Usando
bytearray
Como mencionó J.F.Sebastian en los comentarios a continuación , puede crear una matriz de letras de consonantes en minúsculas utilizando
non_vowels = bytearray(set(range(0x100)) - set(b''aeiou''))
Usando esto podemos traducir la palabra,
''mississippi''.encode(''ascii'', ''ignore'').translate(None, non_vowels)
que devolverá
b''iiii''
. Esto se puede convertir fácilmente astr
mediante el uso dedecode
es decir,b''iiii''.decode("ascii")
. -
Usando
bytes
bytes
devuelve un objeto bytes y es la versión inmutable debytearray
. ( Es específico de Python 3 )non_vowels = bytes(set(range(0x100)) - set(b''aeiou''))
Usando esto podemos traducir la palabra,
''mississippi''.encode(''ascii'', ''ignore'').translate(None, non_vowels)
que devolverá
b''iiii''
. Esto se puede convertir fácilmente astr
mediante el uso dedecode
es decir,b''iiii''.decode("ascii")
.
Comparación de tiempos
Python 3
python3 -m timeit -s "text = ''mississippi''*100; non_vowels = bytes(set(range(0x100)) - set(b''aeiou''))" "text.encode(''ascii'', ''ignore'').translate(None, non_vowels).decode(''ascii'')"
100000 loops, best of 3: 2.88 usec per loop
python3 -m timeit -s "text = ''mississippi''*100; non_vowels = bytearray(set(range(0x100)) - set(b''aeiou''))" "text.encode(''ascii'', ''ignore'').translate(None, non_vowels).decode(''ascii'')"
100000 loops, best of 3: 3.06 usec per loop
python3 -m timeit -s "text = ''mississippi''*100;d=dict.fromkeys(i for i in range(127) if chr(i) not in ''aeiou'')" "text.translate(d)"
10000 loops, best of 3: 71.3 usec per loop
python3 -m timeit -s "import string; import sys; text=''mississippi''*100; m = dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in ''aeiou'')" "text.translate(m)"
10000 loops, best of 3: 71.6 usec per loop
python3 -m timeit -s "text = ''mississippi''*100" "''''.join(c for c in text if c in ''aeiou'')"
10000 loops, best of 3: 60.1 usec per loop
python3 -m timeit -s "text = ''mississippi''*100" "''''.join([c for c in text if c in ''aeiou''])"
10000 loops, best of 3: 53.2 usec per loop
python3 -m timeit -s "import re;text = ''mississippi''*100; p=re.compile(r''[aeiou]'')" "''''.join(p.findall(text))"
10000 loops, best of 3: 57 usec per loop
Los tiempos en orden ordenado
translate (bytes) | 2.88
translate (bytearray)| 3.06
List Comprehension | 53.2
Regular expressions | 57.0
Generator exp | 60.1
dict.fromkeys | 71.3
translate (unicode) | 71.6
Como puede ver, el método final usando
bytes
es el más rápido.
Python 3.5
python3.5 -m timeit -s "text = ''mississippi''*100; non_vowels = bytes(set(range(0x100)) - set(b''aeiou''))" "text.encode(''ascii'', ''ignore'').translate(None, non_vowels).decode(''ascii'')"
100000 loops, best of 3: 4.17 usec per loop
python3.5 -m timeit -s "text = ''mississippi''*100; non_vowels = bytearray(set(range(0x100)) - set(b''aeiou''))" "text.encode(''ascii'', ''ignore'').translate(None, non_vowels).decode(''ascii'')"
100000 loops, best of 3: 4.21 usec per loop
python3.5 -m timeit -s "text = ''mississippi''*100;d=dict.fromkeys(i for i in range(127) if chr(i) not in ''aeiou'')" "text.translate(d)"
100000 loops, best of 3: 2.39 usec per loop
python3.5 -m timeit -s "import string; import sys; text=''mississippi''*100; m = dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in ''aeiou'')" "text.translate(m)"
100000 loops, best of 3: 2.33 usec per loop
python3.5 -m timeit -s "text = ''mississippi''*100" "''''.join(c for c in text if c in ''aeiou'')"
10000 loops, best of 3: 97.1 usec per loop
python3.5 -m timeit -s "text = ''mississippi''*100" "''''.join([c for c in text if c in ''aeiou''])"
10000 loops, best of 3: 86.6 usec per loop
python3.5 -m timeit -s "import re;text = ''mississippi''*100; p=re.compile(r''[aeiou]'')" "''''.join(p.findall(text))"
10000 loops, best of 3: 74.3 usec per loop
Los tiempos en orden ordenado
translate (unicode) | 2.33
dict.fromkeys | 2.39
translate (bytes) | 4.17
translate (bytearray)| 4.21
List Comprehension | 86.6
Regular expressions | 74.3
Generator exp | 97.1
Aquí está mi código.
No estoy exactamente seguro si necesito un contador para que esto funcione.
La respuesta debería ser
''iiii''
.
def eliminate_consonants(x):
vowels= [''a'',''e'',''i'',''o'',''u'']
vowels_found = 0
for char in x:
if char == vowels:
print(char)
eliminate_consonants(''mississippi'')
Puedes probar la forma pitónica de esta manera,
In [1]: s = ''mississippi''
In [3]: [char for char in s if char in ''aeiou'']
Out[3]: [''i'', ''i'', ''i'', ''i'']
Función;
In [4]: def eliminate_consonants(x):
...: return ''''.join(char for char in x if char in ''aeiou'')
...:
In [5]: print(eliminate_consonants(''mississippi''))
iiii
==
pruebas de igualdad.
Está buscando ver si alguno de los caracteres existe en la cadena que está en su lista de ''vocales''.
Para hacer eso, simplemente puede usarlo como a continuación.
Además, veo que tiene una variable ''vocal_encontrada'' pero no la está utilizando. Debajo de un ejemplo, cómo puede resolver esto:
def eliminate_consonants(x):
vowels= [''a'',''e'',''i'',''o'',''u'']
vowels_found = 0
for char in x:
if char in vowels:
print(char)
vowels_found += 1
print "There are", vowels_found, "vowels in", x
eliminate_consonants(''mississippi'')
Su salida sería entonces:
i
i
i
i
There are 4 vowels in mississippi