2012-06-08 11 views
6

文字列中の小文字の文字数を数える最も効率的かつ/または効率的な方法は何ですか?あなたの文字列中の小文字を数えよう

def n_lower_chars(string): 
    return sum([int(c.islower()) for c in string]) 
+0

あなたはこれを試してみたのですか? –

+1

文字列中のcに対してジェネレータの理解 'sum(int(c.islower())を使うべきです。' – Akavall

+1

'int'部分は必要ありません。これはうまくいくでしょう: 'sum(文字列中のcのためのc.islower())' – Akavall

答えて

11

賢いトリック:

は、ここで心に来た最初のものです!しかし、下の文字をフィルタリングして、それぞれに1を加えると読みやすくなります。

def n_lower_chars(string): 
    return sum(1 for c in string if c.islower()) 
+1

バイナリ文字列、Unicode文字列、Python 2、Python 3を効率的に処理するバージョンでは+1です。 – jfs

3
def n_lower_chars(string): 
    return sum(map(str.islower, string)) 
+2

ラムダ式を 'str.islower'で置き換えることで計算時間を半分にすることができます –

+2

今は' In [39]:sum([True、True、False、False、True])Out [39] ]:3'をシェルで実行した後。 – iMom0

+0

@JoelCornett素晴らしい提案 - 上に置く:) –

6
def n_lower_chars(string): 
    return len(filter(str.islower, string)) 
+1

+1。 Python 2の 'filter()'は、入力が文字列の場合は文字列を返します。したがって、メモリの2倍以上を消費することはなく、ほとんどの場合、ジェネレータよりも 'sum()'より速くなければなりません。 'len(filter())'はPython 3で壊れていますが、イテレータを返します。 – jfs

1

あなたがもう少し細かく物事を分割したい場合は :

from collections import Counter 

text = "ABC abc 123" 
print Counter("lower" if c.islower() else 
       "upper" if c.isupper() else 
       "neither" for c in text) 
関連する問題