Удаление согласных из строки в Python

Вот мой код. Я не совсем уверен, нужен ли мне счетчик, чтобы это работало. Ответ должен быть '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') 

  • Пусть класс ведет себя так, как будто это список в Python
  • Python 2.7 - запись и чтение списка из файла
  • Преобразование строкового представления списка в фактический объект списка
  • Учет списка, заменяющий элементы, которые не являются float или int
  • суммировать каждое значение в списке кортежей
  • Как проверить, соответствуют ли все элементы списка условию?
  • Значение bool списка в Python
  • Как превратить строку в список в python?
  • Лучший способ проверить, присутствует ли элемент в списке списков?
  • Преобразуйте все строки в список в int
  • Найти объект в списке, который имеет атрибут, равный некоторому значению (которое соответствует любому условию)
  • Сортировка списка кортежей в последовательном порядке
  • 3 Solutions collect form web for “Удаление согласных из строки в Python”

    Исправление кода

    Строка, if char == vowels: неверно. Это должно быть, if char in vowels: Это потому, что вам нужно проверить, присутствует ли этот конкретный символ в списке гласных. Кроме того, вам нужно print(char,end = '') (в python3), чтобы напечатать вывод как iiii все в одной строке.

    Окончательная программа будет похожа на

     def eliminate_consonants(x): vowels= ['a','e','i','o','u'] for char in x: if char in vowels: print(char,end = "") eliminate_consonants('mississippi') 

    И выход будет

     iiii 

    Другие способы включают

    • Использование in строке

       def eliminate_consonants(x): for char in x: if char in 'aeiou': print(char,end = "") 

      Проще, как выглядит, утверждение, if char in 'aeiou' проверяет, присутствует ли char в строке aeiou .

    • Понимание списка

        ''.join([c for c in x if c in 'aeiou']) 

      Это понимание списка вернет список, который будет содержать символы, только если символ находится в aeiou

    • Выражение генератора

       ''.join(c for c in x if c in 'aeiou') 

      Этот gen exp возвращает генератор, чем возвращает символы, только если символ находится в aeiou

    • Обычные выражения

      Вы можете использовать re.findall чтобы обнаружить только гласные в вашей строке. Код

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

      вернет список гласных, найденных в строке, т.е. ['i', 'i', 'i', 'i'] . Итак, теперь мы можем использовать str.join а затем использовать

       ''.join(re.findall(r'[aeiou]',"mississippi")) 
    • str.translate и maketrans

      Для этого метода вам нужно будет сохранить карту, которая соответствует каждому из негласных, в тип None . Для этого вы можете использовать string.ascii_lowecase . Код для создания карты

       str.maketrans({i:None for i in string.ascii_lowercase if i not in "aeiou"}) 

      это вернет отображение. Храните его в переменной (здесь m для карты)

       "mississippi".translate(m) 

      Это приведет к удалению всех символов без символа из строки.

    • Использование dict.fromkeys

      Вы можете использовать dict.fromkeys вместе с sys.maxunicode . Но не забудьте сначала import sys !

       dict.fromkeys(i for i in range(sys.maxunicode+1) if chr(i) not in 'aeiou') 

      и теперь используйте str.translate .

       'mississippi'.translate(m) 
    • Использование bytearray

      Как упоминалось JFSebastian в комментариях ниже , вы можете создать bytearray нижнего регистра согласных, используя

       non_vowels = bytearray(set(range(0x100)) - set(b'aeiou')) 

      Используя это, мы можем перевести слово,

       'mississippi'.encode('ascii', 'ignore').translate(None, non_vowels) 

      который вернет b'iiii' . Это можно легко преобразовать в str , используя decode то есть b'iiii'.decode("ascii") .

    • Использование bytes

      bytes возвращает объект байтов и является неизменной версией bytearray . ( Это специфичный Python 3 )

       non_vowels = bytes(set(range(0x100)) - set(b'aeiou')) 

      Используя это, мы можем перевести слово,

       'mississippi'.encode('ascii', 'ignore').translate(None, non_vowels) 

      который вернет b'iiii' . Это можно легко преобразовать в str , используя decode то есть b'iiii'.decode("ascii") .


    Сравнение времени

    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 

    Тайминги в отсортированном порядке

     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 

    Как вы можете видеть, последний метод, использующий bytes является самым быстрым.


    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 

    Тайминги в отсортированном порядке

     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 

    Вы можете попробовать pythonic образом, как это,

     In [1]: s = 'mississippi' In [3]: [char for char in s if char in 'aeiou'] Out[3]: ['i', 'i', 'i', 'i'] 

    Функция;

     In [4]: def eliminate_consonants(x): ...: return ''.join(char for char in x if char in 'aeiou') ...: In [5]: print(eliminate_consonants('mississippi')) iiii 

    == тесты для равенства. Вы ищете, есть ли какой-либо из символов в строке, которая находится в вашем гласном виде. Для этого вы можете просто использовать, как показано ниже.

    Кроме того, я вижу, что у вас есть переменная «vowels_found», но не использует ее. Ниже приведен пример того, как вы можете это решить:

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

    Тогда ваш результат будет следующим:

     i i i i There are 4 vowels in mississippi 
    Python - лучший язык программирования в мире.