문자열에서 문자 발생 횟수를 센다


953

문자열에서 문자 발생 횟수를 계산하는 가장 간단한 방법은 무엇입니까?

예를 들면 배의 수 계산 'a'에 나타납니다'Mary had a little lamb'

답변:


1331

str.count (sub [, start [, end]])

sub범위에서 겹치지 않는 부분 문자열 수를 리턴합니다 [start, end]. 선택적 인수 start이며 end슬라이스 표기법으로 해석됩니다.

>>> sentence = 'Mary had a little lamb'
>>> sentence.count('a')
4


112

다른 답변에서 말했듯이 count () 문자열 메서드를 사용하는 것이 가장 간단하지만 자주 수행하는 경우 컬렉션을 확인하십시오 .

from collections import Counter
my_str = "Mary had a little lamb"
counter = Counter(my_str)
print counter['a']

15
자주 사용할 때 왜 더 좋은가요? 장점은 무엇입니까?
meshy

21
주어진 문자열에서 많은 문자의 수를 원하는 경우 Counter는보다 간결한 형식으로 모든 문자를 제공합니다. 많은 다른 문자열에서 한 글자의 수를 원하면 Counter는 아무런 이점도 제공하지 않습니다.
Brenden Brown

2
이 특정 인스턴스의 경우 문자를 계산할 때 collections.counter를 선호합니다. 특정 하위 문자열의 인스턴스를 찾기 위해 정규 표현식 또는 str.count () 메서드를 사용합니다. 테스트하지는 않았지만 단일 문자 스트링의 발생 횟수를 계산하는 대신 모든 문자를 계산하고 사전에 추가하는 데 약간의 오버 헤드가 발생하여 성능 차이가있을 수 있습니다. 검색 할 매우 긴 파일을 생성하고 각 메소드의 실행 타이밍을 지정하는 스크립트를 작성하는 것이 좋습니다.
Daniel B.

5
자주 사용될 때의 이점은 카운터가 모든 카운트를 한 번만 계산한다는 것인데, 이는 mystring.count ( 'a')를 한 번 수행하는 것만 큼 빠릅니다. 따라서이 작업을 20 번 수행하면 계산 시간의 10 배를 절약 할 수 있습니다. 카운터는 또한 아이템이 문자열에 있는지 여부를 알려줍니다 : 예를 들어 카운터에 'a'가있는 경우 :
BAMF4bacon

51

정규 표현식일까요?

import re
my_string = "Mary had a little lamb"
len(re.findall("a", my_string))

30
좋은 생각이지만이 경우에는 과잉입니다. 문자열 방법 'count'는 수행중인 작업에 대해 즉시 명백한 추가 보너스로 동일한 작업을 수행합니다.
nilamo

18
음의 비율 인 이유는 누군가 비슷한 종류의 코드가 필요할 수 있습니다. 내 투표
kiltek

12
문자열에서 문자를 계산할 수있는 가장 효율적인 방법이기 때문에 다운 보트해야합니다. 목표가 단순히 문자 수를 세는 것이라면 질문에서 알 수 있듯이 작업을 수행하는 더 나쁜 방법을 찾기가 어렵습니다. 메모리 및 프로세서 오버 헤드 측면에서이 솔루션은 반드시 피해야합니다. 아무도이 방법을 사용하여 문자열의 문자 수를 찾을 필요가 없습니다.
Christopher

1
@kiltek 실제로,이 작은 스 니펫은 좀 더 복잡한 정규 표현식으로 유용했습니다
Speccy

문자열 방법을 사용할 수없는 경우 좋은 해결책 :len(re.findall('1',bin(10)))
Conor


16

파이썬 -3.x :

"aabc".count("a")

str.count (sub [, start [, end]])

[start, end] 범위에서 하위 문자열 하위의 겹치지 않는 횟수를 반환합니다. 선택적 인수 start 및 end는 슬라이스 표기법으로 해석됩니다.


13

str.count(a)문자열에서 단일 문자를 계산하는 가장 좋은 솔루션입니다. 그러나 더 많은 문자를 계산해야하는 경우 계산하려는 문자 수만큼 문자열 전체를 읽어야합니다.

이 작업에 대한 더 나은 접근 방식은 다음과 같습니다.

from collections import defaultdict

text = 'Mary had a little lamb'
chars = defaultdict(int)

for char in text:
    chars[char] += 1

따라서 문자열에있는 모든 문자의 발생 횟수와 0존재하지 않는 경우 를 반환하는 dict이 있습니다.

>>>chars['a']
4
>>>chars['x']
0

대소 문자를 구분하지 않는 카운터의 경우 서브 클래 싱을 통해 뮤 테이터 및 접근 자 메서드를 재정의 할 수 있습니다 defaultdict(기본 클래스의 메서드 는 읽기 전용 임).

class CICounter(defaultdict):
    def __getitem__(self, k):
        return super().__getitem__(k.lower())

    def __setitem__(self, k, v):
        super().__setitem__(k.lower(), v)


chars = CICounter(int)

for char in text:
    chars[char] += 1

>>>chars['a']
4
>>>chars['M']
2
>>>chars['x']
0

기본적으로 Counter클래스를 다시 구현 하고 collections있습니다.
merv

@merv 실제로는 아닙니다. Counter더 비 대한 순수 파이썬 클래스 인 defaultdict'들__missing__ 되어 C로 작성 . 이와 같은 간단한 작업 ( intC에서도 구현 됨)의 경우이 접근법은 엄청나게 빠릅니다.
Nuno André

11

이 쉽고 간단한 기능은 다음에 도움이 될 수 있습니다.

def check_freq(x):
    freq = {}
    for c in x:
       freq[c] = str.count(c)
    return freq

check_freq("abbabcbdbabdbdbabababcbcbab")
{'a': 7, 'b': 14, 'c': 3, 'd': 3}

3
당신은 그림자 str입니다. 변수에 이름을 지정하면 str더 이상 내장 유형이 아닙니다. 또한 당신은 14시 14 분을 세고 있습니다. 로 변경 for c in text하여 간단히 피할 수 있습니다 for c in set(text).
Nuno André

10

정규 표현식은 대소 문자를 구분하지 않고 정규 표현식의 모든 힘을 원할 경우 매우 유용합니다.

my_string = "Mary had a little lamb"
# simplest solution, using count, is case-sensitive
my_string.count("m")   # yields 1
import re
# case-sensitive with regex
len(re.findall("m", my_string))
# three ways to get case insensitivity - all yield 2
len(re.findall("(?i)m", my_string))
len(re.findall("m|M", my_string))
len(re.findall(re.compile("m",re.IGNORECASE), my_string))

정규식 버전은 실행 시간이 10 배 정도 걸리므로 my_string이 엄청나게 길거나 코드가 딥 루프 안에있는 경우에만 문제가 될 수 있습니다.


1
대 / 소문자를 구분하려고하면 정규식이 과도하게 사용됩니다. my_sting.lower (). count ( 'm')은 성능이 뛰어나고 명확하며 간결합니다.
오우거 코드

5
a = 'have a nice day'
symbol = 'abcdefghijklmnopqrstuvwxyz'
for key in symbol:
    print key, a.count(key)

2
str = "count a character occurance"

List = list(str)
print (List)
Uniq = set(List)
print (Uniq)

for key in Uniq:
    print (key, str.count(key))

2

대안없이 모든 문자 수를 얻을 수있는 방법 Counter(), count그리고 정규 표현식

counts_dict = {}
for c in list(sentence):
  if c not in counts_dict:
    counts_dict[c] = 0
  counts_dict[c] += 1

for key, value in counts_dict.items():
    print(key, value)

1

count문자열에서 문자의 발생을 계산하는 가장 간결하고 효율적인 방법이지만 분명히 lambda다음과 같은 솔루션을 사용하려고 했습니다.

sentence = 'Mary had a little lamb'
sum(map(lambda x : 1 if 'a' in x else 0, sentence))

결과는 다음과 같습니다.

4

또한 문장이 위와 동일한 문자를 포함하는 하위 문자열 목록 인 경우을 사용하면 올바른 결과를 얻을 수 있다는 이점도 있습니다 in. 보세요 :

sentence = ['M', 'ar', 'y', 'had', 'a', 'little', 'l', 'am', 'b']
sum(map(lambda x : 1 if 'a' in x else 0, sentence))

또한 결과는 다음과 같습니다.

4

그러나 물론 'a'이것은이 특별한 경우 와 같은 단일 문자의 발생을 확인할 때만 작동합니다 .


0

"문자열에서 문자를 찾기 위해 count를 사용하지 않고"메소드.

import re

def count(s, ch):

   pass

def main():

   s = raw_input ("Enter strings what you like, for example, 'welcome': ")  

   ch = raw_input ("Enter you want count characters, but best result to find one character: " )

   print ( len (re.findall ( ch, s ) ) )

main()

7
빈 카운트 기능이 왜 필요한가요? 왜 main () 함수입니까? 왜 못 생겼어? 이것은 좋은 대답이 아닙니다.
bugmenot123

0

나는 팬더 라이브러리의 팬, 특히 value_counts()방법입니다. 문자열에서 각 문자의 발생 횟수를 계산하는 데 사용할 수 있습니다.

>>> import pandas as pd
>>> phrase = "I love the pandas library and its `value_counts()` method"
>>> pd.Series(list(phrase)).value_counts()
     8
a    5
e    4
t    4
o    3
n    3
s    3
d    3
l    3
u    2
i    2
r    2
v    2
`    2
h    2
p    1
b    1
I    1
m    1
(    1
y    1
_    1
)    1
c    1
dtype: int64

-1
spam = 'have a nice day'
var = 'd'


def count(spam, var):
    found = 0
    for key in spam:
        if key == var:
            found += 1
    return found
count(spam, var)
print 'count %s is: %s ' %(var, count(spam, var))

-1

파이썬 3

이를 달성하는 두 가지 방법이 있습니다.

1) 내장 함수 count ()

sentence = 'Mary had a little lamb'
print(sentence.count('a'))`

2) 기능을 사용하지 않고

sentence = 'Mary had a little lamb'    
count = 0

for i in sentence:
    if i == "a":
        count = count + 1

print(count)

-2

이 IMHO보다 더 이상-당신은 위 또는 아래 방법을 추가 할 수

def count_letter_in_str(string,letter):
    return string.count(letter)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.