Подсчет всех гласных в тексте

Мой сын только начал учиться в средней школе, а в математике его попросили сделать некоторые домашние задания. Упражнение состояло в том, чтобы подсчитать все гласные в тексте, а затем ответить на некоторые вопросы о частоте.

Из любопытства я написал быстрый скрипт Python для подсчета гласных:

text = "Australian Rules Football - это игра в мяч, в которую играют две команды из восемнадцати игроков с эллипсоидным мячом на большом овальном поле с четырьмя вертикальными стойками на каждом конце. Каждая команда пытается набрать очки, ударяя мяч через соответствующие должности (цели) и не допустить, чтобы их противники выигрывали. Команда, набравшая наибольшее количество очков за данный момент, является победителем. Обычно этот период делится на четыре четверти игры. Игра начинается в начале четверти или после цель, с соревнованием крана между двумя противостоящими игроками (ударами) в центре земли после того, как судья либо бросает мяч вверх, либо подпрыгивает ».

vowels = {'a': 0, 'e': 0, 'i': 0, 'o': 0, 'u': 0}

для t в тексте:
    если t.lower () == 'a':
        гласные ['a'] = 1 + гласные ['a']
    elif t.lower () == 'e':
        гласные ['e'] = 1 + гласные ['e']
    elif t.lower () == 'i':
        гласные ['i'] = 1 + гласные ['i']
    elif t.lower () == 'o':
        гласные ['o'] = 1 + гласные ['o']
    elif t.lower () == 'u':
        гласные ['u'] = 1 + гласные ['u']

печатать гласные

Я не утверждаю, что очень хорош на Python. Мне нравится обманывать его, но я думаю, что здесь что-то не хватает. Сценарий работает, но я четко повторяюсь в цикле для. Какой лучший «Pythonic» был для меня таким?

51 голос | спросил nedlud 21 MaramMon, 21 Mar 2016 10:19:19 +03002016-03-21T10:19:19+03:0010 2016, 10:19:19

2 ответа


79
  1. Изменить значение ниже: text.lower () вместо t.lower () внутри цикла.
  2. Используйте t в гласных, чтобы проверить, является ли символ гласными.
  3. vowels = {...} можно заменить на dict.fromkeys ('aeiou', 0) (см. dict.fromkeys )

    Внимание: используйте это, только если значение неизменное.

    > > > dict.fromkeys ('aeiou', 0)
    {'a': 0, 'i': 0, 'e': 0, 'u': 0, 'o': 0}
    

vowels = dict.fromkeys ('aeiou', 0)

для t в text.lower (): # Изменить для уменьшения один раз.
    если t в гласных:
        гласные [t] + = 1

печатать гласные

В качестве альтернативы вы можете использовать try ... except KeyError ...:

для t в text.lower (): # Изменить однократно.
    пытаться:
        гласные [t] + = 1
    кроме KeyError: # Игнорировать согласные.
        проходить

Или используя включенную батарею, collections.Counter

из коллекции import Counter
vowels = Counter (c для c в text.lower (), если c в 'aeiou')
# => Счетчик ({'e': 54, 'a': 41, 'o': 40, 'i': 37, 'u': 14})
ответил falsetru 21 MaramMon, 21 Mar 2016 10:21:55 +03002016-03-21T10:21:55+03:0010 2016, 10:21:55
3

Стандартный способ, описанный в другом ответе:

vowels_2 = {'a': 0, 'e': 0, 'i': 0, 'o': 0, 'u': 0}
для i в text.lower ():
    если i в гласных_2:
        vowels_2 [i] + = 1

print vowels_2

, который преобразуется в нижний регистр, а затем увеличивает элементы, находящиеся в словаре.


Другой подход, который использует Счетчик в несколько более эффективный способ:

из коллекции import Counter
data = Counter (text.lower ())
vowels_3 = {i: данные [i] для i в 'aeiou'}
print vowels_3

Я думаю, что это может быть более эффективно, потому что я не повторяю каждый символ в строке, а скорее аутсорсинг, чтобы вычислять счетчики для всех символов в библиотеке исполнителей, а затем выбирать только те значения, которые меня волнуют.


и другой способ, который использует другую очень полезную функцию строки: translate , который переводит один набор символов в другой. Здесь мы в основном игнорируем все символы (обратите внимание, что вам нужно добавить все символы, которые вы хотите игнорировать, и это может быть не так хорошо, если у вас их слишком много - например, строка юникода).

dict (Counter (text.lower (). translate (None, 'bcdfghjklmnpqrstvxzwy 0123456789,. ()')))
ответил Salvador Dali 22 MaramTue, 22 Mar 2016 11:42:42 +03002016-03-22T11:42:42+03:0011 2016, 11:42:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132