Hitung jumlah kemunculan karakter dalam string

954

Apa cara paling sederhana untuk menghitung jumlah kemunculan karakter dalam sebuah string?

mis. hitung berapa kali 'a'muncul di'Mary had a little lamb'

Tikar
sumber

Jawaban:

1332

str.count (sub [, mulai [, akhir]])

Mengembalikan jumlah kejadian substring yang tidak tumpang tindih subdalam kisaran [start, end]. Argumen opsional startdan endditafsirkan sebagai notasi slice.

>>> sentence = 'Mary had a little lamb'
>>> sentence.count('a')
4
Kode Ogre
sumber
147

Anda dapat menggunakan count () :

>>> 'Mary had a little lamb'.count('a')
4
bengkak
sumber
112

Seperti jawaban lain mengatakan, menggunakan metode string menghitung () mungkin yang paling sederhana, tetapi jika Anda sering melakukan ini, periksa koleksi. Penghitung :

from collections import Counter
my_str = "Mary had a little lamb"
counter = Counter(my_str)
print counter['a']
Brenden Brown
sumber
15
Mengapa ini lebih baik bila sering digunakan? Apa untungnya?
bersifat jala
21
Jika Anda ingin penghitungan untuk banyak huruf dalam string yang diberikan, Penghitung menyediakan semuanya dalam bentuk yang lebih ringkas. Jika Anda ingin penghitungan untuk satu huruf dari banyak string berbeda, Penghitung tidak memberikan manfaat.
Brenden Brown
2
Untuk contoh khusus ini, menghitung karakter, saya lebih suka collections.counter. Untuk menemukan contoh substring tertentu, saya akan menggunakan ekspresi reguler atau metode str.count (). Saya belum menguji, tetapi mungkin ada perbedaan kinerja karena sedikit overhead dalam menghitung semua karakter dan menambahkan ke kamus daripada menghitung kemunculan satu substring. Saya akan menyarankan menulis skrip untuk menghasilkan file yang sangat panjang untuk mencari dan kemudian menentukan waktu pelaksanaan setiap metode.
Daniel B.
5
Keuntungan ketika sering digunakan adalah bahwa Penghitung menghitung semua hitungan SATU KALI, yang hampir secepat melakukan mystring.count ('a') satu kali. Jadi, jika Anda melakukan ini 20 kali, Anda menghemat mungkin 10 kali waktu perhitungan. Penghitung juga dapat memberi tahu Anda jika item ada di string: misalnya, jika 'a' di konter:
BAMF4bacon
51

Ekspresi reguler mungkin?

import re
my_string = "Mary had a little lamb"
len(re.findall("a", my_string))
Sinan Taifour
sumber
30
Ide yang bagus, tetapi terlalu banyak dalam kasus ini. Metode string 'menghitung' melakukan hal yang sama dengan bonus tambahan yang segera jelas tentang apa yang dilakukannya.
nilamo
18
mengapa tingkat negatif, mungkin seseorang membutuhkan kode semacam ini untuk sesuatu yang serupa. suara saya naik
kiltek
12
Ini harus diturunkan karena itu adalah cara yang paling efisien untuk menghitung karakter dalam sebuah string. Jika tujuannya hanya untuk menghitung karakter, seperti yang ditunjukkan pertanyaan, akan sulit untuk menemukan cara yang lebih buruk untuk melakukan pekerjaan itu. Dalam hal memori dan overhead prosesor, solusi ini pasti harus dihindari. Tidak seorang pun akan "perlu" menggunakan metode ini untuk menemukan jumlah karakter dalam sebuah string.
Christopher
1
@kiltek Memang, cuplikan kecil ini bermanfaat bagi saya dengan ekspresi reguler yang sedikit lebih rumit
Speccy
solusi yang baik ketika metode string tidak tersedia:len(re.findall('1',bin(10)))
Conor
27
myString.count('a');

info lebih lanjut di sini

Recliner yang Lebih Baik
sumber
16

Python-3.x:

"aabc".count("a")

str.count (sub [, mulai [, akhir]])

Kembalikan jumlah kejadian substring yang tidak tumpang tindih dalam rentang [mulai, akhir]. Argumen opsional mulai dan akhir ditafsirkan sebagai notasi slice.

Aaron Fi
sumber
13

str.count(a)adalah solusi terbaik untuk menghitung satu karakter dalam sebuah string. Tetapi jika Anda perlu menghitung lebih banyak karakter, Anda harus membaca seluruh string sebanyak karakter yang ingin Anda hitung.

Pendekatan yang lebih baik untuk pekerjaan ini adalah:

from collections import defaultdict

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

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

Jadi, Anda akan memiliki dict yang mengembalikan jumlah kemunculan setiap huruf dalam string dan 0jika tidak ada.

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

Untuk penghitung case yang tidak sensitif, Anda bisa mengganti metode mutator dan accessor dengan mensubklasing defaultdict(yang kelas dasar hanya baca):

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
Nuno André
sumber
Anda pada dasarnya mengimplementasikan ulang Counter, yang sudah merupakan kelas di collections.
merv
@erv Tidak juga. Counteradalah kelas Python murni lebih membengkak dan defaultdict's __missing__adalah ditulis dalam C . Untuk tugas sederhana seperti ini ( intjuga diimplementasikan dalam C) pendekatan ini lebih cepat.
Nuno André
11

Fungsi yang mudah dan lurus ini dapat membantu:

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}
Erick Mwazonga
sumber
3
Anda membayangi str. Jika Anda memberikan namanya ke variabel, strbukan tipe bawaan lagi. Anda juga menghitung empat belas b empat belas kali. Anda dapat menghindarinya hanya dengan mengganti for c in textdengan for c in set(text).
Nuno André
10

Ekspresi reguler sangat berguna jika Anda ingin case-insensitivity (dan tentu saja semua kekuatan 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))

Perlu diketahui bahwa versi regex membutuhkan urutan sepuluh kali lebih lama untuk dijalankan, yang kemungkinan akan menjadi masalah hanya jika my_string sangat panjang, atau kodenya berada di dalam loop yang dalam.

jafelds
sumber
1
Regex berlebihan jika Anda hanya mencoba untuk memperbaiki sensitivitas case. my_sting.lower (). count ('m') lebih berkinerja, lebih jelas, dan lebih ringkas.
Kode Ogre
5
a = 'have a nice day'
symbol = 'abcdefghijklmnopqrstuvwxyz'
for key in symbol:
    print key, a.count(key)
calon
sumber
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))
Thiru G
sumber
2

Cara alternatif untuk mendapatkan semua jumlah karakter tanpa menggunakan Counter(), countdan 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)
Syed Shamikh Shabbir
sumber
1

countjelas merupakan cara yang paling ringkas dan efisien untuk menghitung kemunculan karakter dalam sebuah string, tetapi saya mencoba mencari solusi menggunakan lambda, sesuatu seperti ini:

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

Ini akan menghasilkan:

4

Juga, ada satu keuntungan lagi untuk ini adalah jika kalimat adalah daftar sub-string yang berisi karakter yang sama seperti di atas, maka ini juga memberikan hasil yang benar karena penggunaan in. Lihat:

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

Ini juga menghasilkan:

4

Tapi Tentu saja ini hanya akan berfungsi ketika memeriksa kemunculan karakter tunggal seperti 'a'dalam kasus khusus ini.

Satish Garg
sumber
0

Metode "Tanpa menggunakan hitungan untuk menemukan karakter yang Anda inginkan dalam string".

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()
OLEH
sumber
7
Mengapa fungsi penghitungan kosong? Mengapa fungsi utama ()? Mengapa ruang jelek ada di mana-mana? Ini BUKAN jawaban yang bagus.
bugmenot123
0

Saya penggemar perpustakaan panda, khususnya value_counts()metodenya. Anda bisa menggunakannya untuk menghitung kemunculan setiap karakter di string Anda:

>>> 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
Sébastien Wieckowski
sumber
-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))
calon
sumber
-1

Python 3

Ada dua cara untuk mencapai ini:

1) Dengan jumlah fungsi bawaan ()

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

2) Tanpa menggunakan fungsi

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

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

print(count)
Dipen Gajjar
sumber
-2

Tidak lebih dari IMHO ini - Anda dapat menambahkan metode atas atau bawah

def count_letter_in_str(string,letter):
    return string.count(letter)
Benih Tim
sumber