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'

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


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

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

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



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

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}

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.


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)

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

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)

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.


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

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

-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

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)

-2

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

def count_letter_in_str(string,letter):
    return string.count(letter)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.