文中の子音の表現を取得する方法について、頭を悩ませようとしています。私が今使っているコードはうまくいかないようです:
vowels = ("aeiou")
count = 0
for x in text:
if not x in vowels:
count += 1
たとえば、「hello world」を入力として、8つの子音を受け取ります。よろしくお願いします。
文中の子音の表現を取得する方法について、頭を悩ませようとしています。私が今使っているコードはうまくいかないようです:
vowels = ("aeiou")
count = 0
for x in text:
if not x in vowels:
count += 1
たとえば、「hello world」を入力として、8つの子音を受け取ります。よろしくお願いします。
「母音でも、空白でも、句読点でもない...」よりも、子音を直接チェックする方がよいでしょう。
consonants = "bcdfghjklmnpqrstvwxyz"
count = 0
for x in text:
if x in consonants:
count += 1
もっと直接的に
consonants = set("bcdfghjklmnpqrstvwxyz")
count = sum(1 for c in text if c in consonants)
子音にセットを使用すると、ルックアップが少し速くなります
スペースを含むすべての文字をカウントしています。さらに、句読点、スペース、およびその他の非子音文字を含めることをお勧めします。
速度が関係する場合は、コンパイルされた正規表現がカウントを取得するための最速の方法であるように見えます。
タイミング結果
Found 8292 Consonants in 0.002978 seconds using compiled regex
Found 8292 Consonants in 0.009412 seconds using sets
Found 8292 Consonants in 0.024511 seconds by looking at each character
テストコード
import re
import time
import os
string_length = 100000
random_string = os.urandom(string_length)
con_re = re.compile("[bcdfghjklmnpqrstvwxyz]")
start = time.clock()
re_results = con_re.findall(random_string)
print "Found %d Consonants in %f seconds using compiled regex" % (len(re_results), time.clock() - start)
consonants = set("bcdfghjklmnpqrstvwxyz")
start = time.clock()
count = sum(1 for c in random_string if c in consonants)
print "Found %d Consonants in %f seconds using sets" % (count, time.clock() - start)
cnt = 0
consonants = "bcdfghjklmnpqrstvwxyz"
start = time.clock()
for x in range(string_length):
if random_string[x] in consonants:
cnt += 1
print "Found %d Consonants in %f seconds by looking at each character" % (cnt, time.clock() - start)
import string
all_letters = string.ascii_letters
consonants = set(all_letters).difference(set(('a','e','i','o','u','A','E','I','O','U')))
my_sentence = 'Here is my Sentence'
sum_of_cons = sum(ele in consonants for ele in my_sentence)
結果
>>> sum_of_cons
10
空白を考慮することを忘れないでください。
8は、コードに基づく正解のように見えます。
スペース文字は母音リストにありません。
多分あなたはこのコードを使うことができます:
consonants = list("bcdfghjklmnpqrstvwxyz")
word=" hello world "
number_of_consonants = sum(word.count(c) for c in consonants)
非母音、辞書理解、およびCounter
.
import collections as ct
text = "Hello world!"
vowels = ("aeiou")
letters = ct.Counter(text.lower())
前に示した同様の手法では、子音の長いリストを用意する必要はありません。isalpha
と を使用して、母音ではない文字を引き続き検索できます not in vowels
。 isalpha
スペースと句読点を削除します。
# Option 1: Non-vowels
sum(1 for letter in text.lower() if letter.isalpha() and not letter in vowels)
# 7
詳細については、Counter
オブジェクトを使用してテキスト内の一意の文字を集計し、辞書内包表記を使用してすべての子音を保持できます。
# Option 2: Dictionary comprehension
comp = {k:v for k, v in letters.items() if letter.isalpha() and not letter in vowels}
comp
# {'d': 1, 'h': 1, 'l': 3, 'r': 1, 'w': 1}
sum(comp.values())
# 7
さらに、オブジェクトにはやCounter
などの便利な属性があります。もちろん、すべての子音を簡単に合計することもできます。ここでは、子音だけのスペシャルを作成します。.most_common()
.elements()
Counter
# Option 3: Consonants counter
consonants = letters.copy()
for k in letters:
if k in vowels or not k.isalpha():
consonants.pop(k)
consonants
# Counter({'d': 1, 'h': 1, 'l': 3, 'r': 1, 'w': 1})
consonants.most_common(3)
#[('l', 3), ('d', 1), ('h', 1)]
list(consonants.elements())
# ['d', 'h', 'l', 'l', 'l', 'r', 'w']
sum(consonants.values())
# 7
def count_consonants(some_string):
some_string=some_string.lower();
consonants = list("bcdfghjklmnpqrstvwxyz")
number_of_consonants = sum(some_string.count(c) for c in consonants)
return number_of_consonants
test_str="Hercules was a hero"
result_str=count_consonants(test_str)
print(result_str)