Подсчет всех гласных в тексте
Мой сын только начал учиться в средней школе, а в математике его попросили сделать некоторые домашние задания. Упражнение состояло в том, чтобы подсчитать все гласные в тексте, а затем ответить на некоторые вопросы о частоте.
Из любопытства я написал быстрый скрипт 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» был для меня таким?
2 ответа
- Изменить значение ниже:
text.lower ()
вместоt.lower ()
внутри цикла. - Используйте
t в гласных
, чтобы проверить, является ли символ гласными. -
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})
Стандартный способ, описанный в другом ответе:
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,. ()')))