2012-06-08 36 views
6

Cách ghép và số lượng các ký tự trong chuỗi là chữ thường là gì?Đếm các ký tự chữ thường trong một chuỗi

Đây là điều đầu tiên mà đến tâm trí:

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

bạn đã thử này ra? –

+1

Bạn nên sử dụng máy phát hiểu 'tổng (int (c.islower()) cho c trong chuỗi)' – Akavall

+1

Và bạn không cần phần 'int'. Điều này sẽ làm việc: 'sum (c.islower() cho c trong chuỗi)' – Akavall

Trả lời

11

lừa Clever của bạn! Tuy nhiên, tôi thấy nó dễ đọc hơn để lọc các ký tự dưới, thêm 1 cho mỗi ký tự.

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

+1 cho phiên bản hoạt động cho các chuỗi byte, chuỗi Unicode, Python 2, Python 3 theo cách hiệu quả về bộ nhớ. – jfs

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

Bạn có thể cắt thời gian tính toán bằng một nửa bằng cách thay thế biểu thức lambda của bạn bằng 'str.islower' –

+2

Chỉ bây giờ tôi mới biết rằng 'Trong [39]: tổng ([True, True, False, False, True]) Out [39 ]: 3' sau khi chạy nó trong trình bao. – iMom0

+0

@JoelCornett gợi ý tốt đẹp - đặt nó ở trên :) –

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

+1. 'filter()' trên Python 2 trả về một chuỗi nếu đầu vào là một chuỗi để nó không ăn nhiều hơn gấp đôi bộ nhớ và nó phải nhanh hơn 'sum()' trên một bộ tạo trong hầu hết các trường hợp. Mặc dù 'len (filter())' phá vỡ trên Python 3, nó trả về một trình lặp. – jfs

1

Nếu bạn muốn chia điều tinh tế hơn một chút:

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) 
Các vấn đề liên quan