Đếm số lần xuất hiện của một ký tự trong chuỗi


954

Cách đơn giản nhất để đếm số lần xuất hiện của một ký tự trong chuỗi là gì?

ví dụ: đếm số lần 'a'xuất hiện trong'Mary had a little lamb'

Câu trả lời:




112

Như các câu trả lời khác đã nói, sử dụng phương thức chuỗi đếm () có lẽ là đơn giản nhất, nhưng nếu bạn đang làm điều này thường xuyên, hãy kiểm tra các bộ sưu tập .

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

15
Tại sao điều này tốt hơn khi được sử dụng thường xuyên? Lợi thế là gì?
meshy

21
Nếu bạn muốn đếm số lượng nhiều chữ cái trong một chuỗi nhất định, Counter cung cấp tất cả chúng ở dạng cô đọng hơn. Nếu bạn muốn đếm cho một chữ cái từ nhiều chuỗi khác nhau, Counter không cung cấp lợi ích.
Brenden Brown

2
Trong trường hợp cụ thể này, đếm các ký tự, tôi thích bộ sưu tập. Để tìm các phiên bản của một chuỗi con cụ thể, tôi sẽ sử dụng một biểu thức chính quy hoặc phương thức str.count (). Tôi chưa thử nghiệm, nhưng có thể có sự khác biệt về hiệu suất do tính quá cao trong việc đếm tất cả các ký tự và nối vào từ điển thay vì đếm các lần xuất hiện của một chuỗi con. Tôi sẽ đề nghị viết một tập lệnh để tạo một tệp rất dài để tìm kiếm và sau đó thực hiện thời gian của từng phương thức.
Daniel B.

5
Ưu điểm khi được sử dụng thường xuyên là Counter tính toán tất cả các số đếm MỘT LẦN, gần như nhanh như thực hiện mystring.count ('a') một lần. Do đó, nếu bạn làm điều này 20 lần, bạn đang tiết kiệm có thể gấp 10 lần thời gian tính toán. Bộ đếm cũng có thể cho bạn biết nếu một mục nằm trong chuỗi: ví dụ: nếu 'a' trong bộ đếm:
BAMF4bacon

51

Biểu thức thông thường có thể?

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

30
Một ý tưởng tốt, nhưng quá mức trong trường hợp này. Phương thức chuỗi 'đếm' thực hiện điều tương tự với phần thưởng được thêm vào là rõ ràng ngay lập tức về những gì nó đang làm.
nilamo

18
Tại sao tỷ lệ âm, có thể ai đó cần loại mã này cho một cái gì đó tương tự. phiếu bầu của tôi lên
kiltek

12
Điều này nên được hạ cấp bởi vì đó là cách kém hiệu quả nhất có thể để đếm các ký tự trong một chuỗi. Nếu mục tiêu chỉ đơn giản là đếm các ký tự, như câu hỏi chỉ ra, thật khó để tìm ra cách tồi tệ hơn để thực hiện công việc. Về bộ nhớ và bộ xử lý trên cao, giải pháp này chắc chắn nên tránh. Không ai sẽ "cần" sử dụng phương pháp này để tìm số lượng ký tự trong một chuỗi.
Christopher

1
@kiltek Thật vậy, đoạn trích nhỏ này rất hữu ích với tôi với biểu thức chính quy phức tạp hơn một chút
Speccy

giải pháp tốt khi các phương thức chuỗi không có sẵn:len(re.findall('1',bin(10)))
Conor



13

str.count(a)là giải pháp tốt nhất để đếm một ký tự đơn trong chuỗi. Nhưng nếu bạn cần đếm nhiều ký tự hơn, bạn sẽ phải đọc toàn bộ chuỗi nhiều lần số ký tự bạn muốn đếm.

Một cách tiếp cận tốt hơn cho công việc này sẽ là:

from collections import defaultdict

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

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

Vì vậy, bạn sẽ có một lệnh trả về số lần xuất hiện của mỗi chữ cái trong chuỗi và 0nếu nó không xuất hiện.

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

Đối với bộ đếm không phân biệt chữ hoa chữ thường, bạn có thể ghi đè các phương thức bộ biến đổi và bộ truy cập bằng cách phân lớp defaultdict(lớp cơ sở 'chỉ đọc):

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

Về cơ bản bạn đang thực hiện lại Counter, đã là một lớp trong collections.
merv

@merv Không hẳn. Counterlà một lớp Python tinh khiết cồng kềnh hơn và defaultdict's __missing__được viết bằng C . Đối với một nhiệm vụ đơn giản như thế này ( intcũng được thực hiện trong C), cách tiếp cận này nhanh hơn rất nhiều.
Nuno André

11

Chức năng dễ dàng và chuyển tiếp này có thể giúp:

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
Bạn đang bị bóng đè str. Nếu bạn đặt tên của nó cho biến, strkhông phải là loại tích hợp nữa. Ngoài ra, bạn đang đếm mười bốn b mười bốn lần. Bạn có thể tránh điều đó chỉ bằng cách thay đổi for c in textvới for c in set(text).
Nuno André

10

Biểu thức thông thường rất hữu ích nếu bạn muốn phân biệt chữ hoa chữ thường (và tất nhiên là toàn bộ sức mạnh của regex).

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))

Xin lưu ý rằng phiên bản regex có thời gian chạy gấp mười lần, điều này có thể chỉ là vấn đề nếu my_ chuỗi quá dài hoặc mã nằm trong một vòng lặp sâu.


1
Regex là quá mức cần thiết nếu bạn chỉ đang cố gắng khắc phục trường hợp nhạy cảm. my_sting.lower (). Count ('m') có hiệu suất cao hơn, rõ ràng hơn và cô đọng hơn.
Mã Ogre

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

Một cách khác để có được tất cả các tội nhân vật mà không sử dụng Counter(), countvà regex

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

countchắc chắn là cách ngắn gọn và hiệu quả nhất để đếm sự xuất hiện của một ký tự trong một chuỗi nhưng tôi đã cố gắng đưa ra một giải pháp bằng cách sử dụng lambda, đại loại như thế này:

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

Điều này sẽ dẫn đến:

4

Ngoài ra, có một lợi thế nữa cho điều này là nếu câu là danh sách các chuỗi con chứa cùng các ký tự như trên, thì điều này cũng cho kết quả chính xác vì sử dụng in. Có một cái nhìn:

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

Điều này cũng dẫn đến:

4

Nhưng tất nhiên điều này sẽ chỉ hoạt động khi kiểm tra sự xuất hiện của một ký tự đơn lẻ, như 'a'trong trường hợp cụ thể này.


0

Phương thức "Không sử dụng số đếm để tìm bạn muốn ký tự trong chuỗi".

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
Tại sao hàm đếm trống? Tại sao hàm main ()? Tại sao không gian xấu xí ở khắp mọi nơi? Đây KHÔNG phải là một câu trả lời tốt.
bugmenot123

0

Tôi là một fan hâm mộ của thư viện gấu trúc, đặc biệt là value_counts()phương pháp. Bạn có thể sử dụng nó để đếm sự xuất hiện của từng ký tự trong chuỗi của bạn:

>>> 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

Con trăn 3

Có hai cách để đạt được điều này:

1) Với số lượng hàm tích hợp ()

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

2) Không sử dụng chức năng

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

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

print(count)

-2

Không nhiều hơn IMHO này - bạn có thể thêm các phương thức trên hoặc dưới

def count_letter_in_str(string,letter):
    return string.count(letter)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.