2012-06-08 3 views
6

Каков самый пифонический и/или эффективный способ подсчета количества символов в строчной строке?Подсчет символов нижнего регистра в строке

Вот первое, что пришло на ум:

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

пытались ли вы это? –

+1

Вы должны использовать генераторное понимание 'sum (int (c.islower()) для c в строке)' – Akavall

+1

И вам не нужна часть 'int'. Это будет работать: 'sum (c.islower() для c в строке)' – Akavall

ответ

11

Clever трюк твой! Тем не менее, я считаю его более читаемым для фильтрации нижних символов, добавляя по 1 для каждого.

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

+1 для версии, которая работает для байтов, строк Unicode, Python 2, Python 3 в эффективном режиме памяти. – 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. 'filter()' на Python 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) 
Смежные вопросы