Учет списка для подсчета согласных [дублировать]

Ну, причина в том, что привязки выполняются при выполнении кода, и выполняется определение функции, ну ... когда функции определены.

Сравните это:

class BananaBunch:
    bananas = []

    def addBanana(self, banana):
        self.bananas.append(banana)

Этот код страдает от такого же неожиданного случая. bananas - это атрибут класса, и, следовательно, когда вы добавляете к нему вещи, он добавляется ко всем экземплярам этого класса. Причина в том, что это точно то же самое.

Это просто «Как это работает», и заставить его работать по-другому в функциональном случае, вероятно, будет сложно, а в случае класса вероятно невозможно или, по крайней мере, замедлить объект создание экземпляра, так как вам придется хранить код класса и выполнять его при создании объектов.

Да, это неожиданно. Но как только пенни падает, она прекрасно вписывается в то, как работает Python в целом. На самом деле, это хорошее учебное пособие, и как только вы поймете, почему это происходит, вы будете намного лучше читать python.

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

3
задан Bolo 12 October 2011 в 08:03
поделиться

7 ответов

number_of_consonants = sum(word.count(c) for c in consonants)

number_of_vowels = sum(word.count(c) for c in vowels)
10
ответ дан eumiro 20 August 2018 в 21:41
поделиться
  • 1
    Это лучше, чем мое решение, используя фильтр () – spicavigo 12 October 2011 в 08:04
  • 2
    Небольшое изменение сделает ваше решение немного быстрее. Вместо генератора используйте точную сумму списка ([word.count (c) для c в согласных]). Вы можете позволить себе это сделать, поскольку список не слишком велик. – spicavigo 12 October 2011 в 08:17
  • 3
    @spicavigo - вы уверены, что решение списка быстрее? С согласными и "привет мир" он на 17% медленнее. Но с согласными и string.letters * 1000 это примерно такая же скорость. – eumiro 12 October 2011 в 08:20
  • 4
    Я думаю, что мой укусит твой :), камни регулярных выражений! – scriptmonster 12 October 2011 в 08:37
  • 5
    sum(1 for c in vowels) – Burhan Khalid 19 April 2018 в 09:37
def main():
    vowels = 'aeiou'
    consonants = 'bcdfghjklmnpqrstvwxyz'
    txt_input = input('Enter a sentence or a word: ').lower()
    vowel = sum(txt_input.count(i) for i in vowels)
    consonant = sum(txt_input.count(i) for i in consonants)
    print("Number of vowels in the string: ",vowel)
    print("Number of consonants in the string: ",consonant)

main()
-1
ответ дан 2ps 20 August 2018 в 21:41
поделиться
  • 1
    при включении блока кода вы захотите либо включить комментарии, объясняющие ваш код, либо некоторую экспозицию вокруг вашего кода, объясняющую ваше решение. Благодаря! – 2ps 5 February 2017 в 19:26

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

import collections

s = "This is an example sentence."

counter = collections.Counter(s)

consonants = 'bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ'
num_consonants = sum(counter[char] for char in consonants)
# result: 14

vowels = 'aeiouAEIOU'
num_vowels = sum(counter[char] for char in vowels)
# result: 9
0
ответ дан Aran-Fey 20 August 2018 в 21:41
поделиться
Python 2.6.7 (r267:88850, Jun 27 2011, 13:20:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "asfdrrthdhyjkae"
>>> vowels = "aeiouy"
>>> consonants = "bcdfghjklmnpqrstvexz"
>>> nv = 0
>>> nc = 0
>>> for char in a:
...     if char in vowels:
...         nv += 1
...     elif char in consonants:
...         nc += 1
...         
>>> print nv
4
>>> print nc
11
>>> 
0
ответ дан joaquin 20 August 2018 в 21:41
поделиться
  • 1
    – Nick Johnson 12 October 2011 в 07:58
  • 2
    то не используйте elif, используйте, если и вы получите y, учтенный как в nv, так и nc. Но почему вы хотите это сделать? В любом случае OP, по-видимому, рассматривает y как гласную. – joaquin 12 October 2011 в 08:01

Это решение, которое учитывает согласные и гласные, в то время как явно исключает пунктуацию.

from string import punctuation

x = 'This is an example sentence.'

table = str.maketrans('', '', punctuation)
x = x.translate(table).lower().replace(' ', '')
vowels = set('aeiou')

consonants = sum(i not in vowels for i in x)
vowels = sum(i in vowels for i in x)

print(consonants)  # 14
print(vowels)      # 9
1
ответ дан jpp 20 August 2018 в 21:41
поделиться
  • 1
    @ Aran-Fey, yep все еще редактировал - также добавил тривиальное решение гласных. Thks – jpp 19 April 2018 в 09:37

Использование regex было бы альтернативой:

>>> import re
>>> re.findall('[bcdfghjklmnpqrstvwxyz]','there wont be any wovels in the result') 
['t', 'h', 'r', 'n', 't', 'b', 'n', 'v', 'l', 's', 'n', 't', 'h', 'r', 's', 'l', 't']

Если вы берете свою длину, ваша проблема решается.

text = 'some text'

wovels = 'aeiou'
consonants = 'bcdfghjklmnpqrstvwxyz'

from re import findall
wovelCount = len(findall('[%s]' % wovels, text))
consonatCount = len(findall('[%s]' % consonants, text))
1
ответ дан scriptmonster 20 August 2018 в 21:41
поделиться
if mode == "vowels":
    print(len(filter(lambda x: x in vowels, word)))
else:
    print(len(filter(lambda x: x in consonants, word)))

Итак, я приурочил решение моего и эумиро. Его лучше

>> vc=lambda :sum(word.count(c) for c in vowels)
>> vc2=lambda : len(filter(lambda x: x in vowels, word))
>> timeit.timeit(vc, number=10000)
0.050475120544433594
>> timeit.timeit(vc2, number=10000)
0.61688399314880371
3
ответ дан spicavigo 20 August 2018 в 21:41
поделиться
  • 1
    Хорошее и лаконичное решение, но новичок в Python, вероятно, не поймет этого. Было бы неплохо добавить несколько предложений, объясняющих код. – Bolo 12 October 2011 в 08:02
  • 2
    ^ Точно, но ссылки, тем не менее, всегда хорошие вещи! Я действительно нашел некоторые «лямбда». вещи из других подобных вопросов, и фактически просматривал документацию по нему. Тем не менее, спасибо за помощь! – ZenOokami 12 October 2011 в 21:06
Другие вопросы по тегам:

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