python string list python-3.x python-idle

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 cadena

    def 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 si char está presente en la cadena aeiou .

  • Una lista de comprensión

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

  • Una expresión generadora

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

  • Expresiones regulares

    Puede usar re.findall para descubrir solo las vocales en su cadena. El código

    re.findall(r''[aeiou]'',"mississippi")

    devolverá una lista de vocales encontradas en la cadena, es decir, [''i'', ''i'', ''i'', ''i''] . Así que ahora podemos usar str.join y luego usar

    ''''.join(re.findall(r''[aeiou]'',"mississippi"))

  • str.translate y maketrans

    Para esta técnica, deberá almacenar un mapa que coincida con cada una de las no vocales con un tipo None . Para esto puede usar string.ascii_lowecase . El código para hacer el mapa es

    str.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 con sys.maxunicode . ¡Pero recuerde import 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 a str mediante el uso de decode es decir, b''iiii''.decode("ascii") .

  • Usando bytes

    bytes devuelve un objeto bytes y es la versión inmutable de bytearray . ( 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 a str mediante el uso de decode 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