3

文中の子音の表現を取得する方法について、頭を悩ませようとしています。私が今使っているコードはうまくいかないようです:

vowels = ("aeiou")
count = 0
for x in text:
    if not x in vowels:
        count += 1

たとえば、「hello world」を入力として、8つの子音を受け取ります。よろしくお願いします。

4

10 に答える 10

9

「母音でも、空白でも、句読点でもない...」よりも、子音を直接チェックする方がよいでしょう。

consonants = "bcdfghjklmnpqrstvwxyz"
count = 0
for x in text:
    if x in consonants:
        count += 1
于 2012-04-23T23:44:48.240 に答える
3

もっと直接的に

consonants = set("bcdfghjklmnpqrstvwxyz")
count = sum(1 for c in text if c in consonants)

子音にセットを使用すると、ルックアップが少し速くなります

于 2012-04-23T23:48:47.100 に答える
3

スペースを含むすべての文字をカウントしています。さらに、句読点、スペース、およびその他の非子音文字を含めることをお勧めします。

于 2012-04-23T23:40:04.423 に答える
1

速度が関係する場合は、コンパイルされた正規表現がカウントを取得するための最速の方法であるように見えます。

タイミング結果

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)
于 2012-04-24T02:44:32.970 に答える
1
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
于 2012-04-23T23:48:39.843 に答える
0

空白を考慮することを忘れないでください。

8は、コードに基づく正解のように見えます。

スペース文字は母音リストにありません。

于 2012-04-23T23:36:27.210 に答える
0

多分あなたはこのコードを使うことができます:

consonants = list("bcdfghjklmnpqrstvwxyz")
word=" hello world "
number_of_consonants = sum(word.count(c) for c in consonants)
于 2012-04-23T23:46:49.143 に答える
0

非母音、辞書理解、およびCounter.

import collections as ct

text = "Hello world!"
vowels = ("aeiou")
letters = ct.Counter(text.lower())

前に示した同様の手法では、子音の長いリストを用意する必要はありません。isalphaと を使用して、母音ではない文字を引き続き検索できます not in vowelsisalphaスペースと句読点を削除します。

# 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
于 2016-12-25T01:06:10.487 に答える
-1
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)
于 2016-02-28T13:42:02.313 に答える