2012-06-08 4 views
6

문자열에서 소문자 인 문자 수를 세는 가장 파이썬 적이며 효율적인 방법은 무엇입니까? 당신의문자열의 소문자 수를 계산하십시오.

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

이 밖으로 시도 했습니까? –

+1

문자열 생성자'sum (int (c.islower())를 사용해야합니다. ' – Akavall

+1

그리고'int '부분은 필요 없습니다. 이것은 작동 할 것이다 :'sum (c.islower() for c for string) ' – Akavall

답변

11

영리한 트릭 :

여기에 마음에 와서 제일 먼저입니다! 그러나 더 낮은 문자를 필터링하여 각 문자에 대해 1을 더 읽기 쉽도록 찾습니다.

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

Bytestrings, 유니 코드 문자열, 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. 파이썬 2의'filter()'는 입력이 문자열 일 때 문자열을 반환하므로 메모리를 두 번 이상 먹지 않으며 대부분의 경우 생성기보다'sum()'보다 빠릅니다. 'len (filter())'는 반복자를 반환하는 곳의 파이썬 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) 
관련 문제