Dizedeki bir karakterin sayı oluşumlarını sayma


954

Bir dizedeki bir karakterin oluşum sayısını saymanın en basit yolu nedir?

örneğin 'a','Mary had a little lamb'

Yanıtlar:




112

) Diğer cevaplar dize yöntemi sayımı (kullanarak, söylediği gibi muhtemelen en basit olmakla birlikte, sık sık yapıyorsan, kontrol collections.Counter :

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

15
Sık kullanıldığında bu neden daha iyi? Avantajı nedir?
meshed

21
Belirli bir dizedeki harflerin çoğunun sayımını istiyorsanız, Counter bunların tümünü daha özlü bir biçimde sağlar. Çok sayıda farklı dizeden bir harfin sayılmasını istiyorsanız, Counter hiçbir fayda sağlamaz.
Brenden Brown

2
Bu özel örnek için, karakterleri saymak, collections.counter tercih ederim. Belirli bir alt dizenin örneklerini bulmak için, normal bir ifade veya str.count () yöntemini kullanırdım. Test etmedim, ancak tek bir alt dizenin oluşumlarını saymak yerine tüm karakterleri sayma ve bir sözlüğe ekleme konusunda hafif bir ek yük nedeniyle bir performans farkı olabilir. Aramak için çok uzun bir dosya oluşturmak için bir komut dosyası yazma ve daha sonra her yöntemin yürütme zamanlama öneririm.
Daniel

5
Sık kullanıldığında avantajı, Counter'un bir defada mystring.count ('a') yapmak kadar hızlı olan tüm sayıları ONE TIME hesaplamasıdır. Böylece, bunu 20 kez yaparsanız, hesaplama süresinin belki 10 katı tasarruf edersiniz. Sayaç ayrıca bir öğenin dizede olup olmadığını da söyleyebilir: örneğin, sayaçtaki 'a' ise:
BAMF4bacon

51

Düzenli ifadeler belki?

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

30
Güzel bir fikir, ama bu durumda aşırıya kaç. 'Count' dize yöntemi aynı şeyi, yaptığı şey hakkında hemen belirgin olma bonusu ile de yapar.
nilamo

18
neden negatif oran, belki birisi benzer bir şey için bu tür bir kod gerekiyor. benim
oyum

12
Bu, bir dizgideki karakterleri saymanın mümkün olan en az etkili yolu olduğu için indirilmelidir. Hedef, soruların belirttiği gibi karakterleri saymaksa, işi yapmanın daha kötü bir yolunu bulmak zor olurdu. Bellek ve işlemci yükü açısından bu çözümden kesinlikle kaçınılmalıdır. Hiç kimsenin bir dizgideki karakter sayısını bulmak için bu yöntemi kullanması gerekmez.
Christopher

1
@kiltek Gerçekten, bu küçük pasaj benim için biraz daha karmaşık düzenli bir ifade ile faydalı oldu
Speccy

string yöntemleri mevcut olmadığında iyi bir çözüm:len(re.findall('1',bin(10)))
Conor



13

str.count(a)bir dizede tek bir karakteri saymak için en iyi çözümdür. Ancak, daha fazla karakter saymanız gerekiyorsa, dizenin tamamını saymak istediğiniz karakter sayısından daha fazla okumanız gerekir.

Bu iş için daha iyi bir yaklaşım:

from collections import defaultdict

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

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

Böylece, dizedeki her harfin yineleme sayısını ve 0mevcut değilse döndüren bir kararınız olacaktır.

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

Büyük / küçük harfe duyarlı olmayan bir sayaç için, alt sınıflandırma yoluyla mutator ve erişimci yöntemlerini geçersiz kılabilirsiniz defaultdict(temel sınıflar salt okunurdur):

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

Temelde yeniden ekleniyorsunuz Counter, ki bu zaten bir sınıf collections.
merv

@merv Pek değil. CounterDaha şişirilmiş saf Python sınıftır ve defaultdict'ın __missing__olduğu C ile yazılmış . Bunun gibi basit bir görev için ( intC de uygulanır) bu yaklaşım çok daha hızlıdır.
Nuno André

11

Bu kolay ve anlaşılır fonksiyon yardımcı olabilir:

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
Gölgeliyorsun str. Değişkene adını verirseniz, strartık yerleşik bir tür değildir. Ayrıca ondört b'nin ondört katı sayıyorsunuz. Sadece değiştirerek bu önleyebilirsiniz for c in textile for c in set(text).
Nuno André

10

Büyük / küçük harf duyarsızlığı (ve elbette normal ifadenin tüm gücü) istiyorsanız düzenli ifadeler çok yararlıdır.

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

Normal ifade sürümünün çalıştırılması için on kat daha uzun sürdüğünü unutmayın, bu da yalnızca my_string çok uzunsa veya kodun derin bir döngü içerisindeyse sorun olacaktır.


1
Yalnızca büyük / küçük harf duyarlılığını düzeltmeye çalışıyorsanız Regex aşırıya kaçıyor. my_sting.lower (). count ('m') daha performanslı, daha net ve daha özlü.
Ogre Kodları

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

Alternatif kullanmadan tüm karakter sayılarını almanın yolu Counter(), countve düzenli ifade

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

countkesinlikle bir dizede bir karakterin oluşumunu saymanın en özlü ve etkili yolu ama ben lambdaböyle bir şey kullanarak bir çözüm bulmaya çalıştı :

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

Bunun sonucu:

4

Ayrıca, bunun bir avantajı da, cümlenin yukarıdakiyle aynı karakterleri içeren alt dizelerin bir listesi olması, aynı zamanda kullanımından dolayı doğru sonucu vermesidir in. Bir göz atın:

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

Bu ayrıca aşağıdakilerle de sonuçlanır:

4

Tabii ki bu sadece 'a'bu özel durumda olduğu gibi tek bir karakterin oluşumunu kontrol ederken işe yarayacaktır .


0

Msgstr "Dizgede istediğiniz karakteri bulmak için count kullanmadan" yöntemi.

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
Neden boş sayım işlevi? Neden main () işlevi? Neden her yerde çirkin alanlar? Bu iyi bir cevap DEĞİLDİR.
bugmenot123

0

Ben panda kütüphanesi, özellikle value_counts()yöntem hayranıyım . Dizenizdeki her karakterin oluşumunu saymak için kullanabilirsiniz:

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

Bunu başarmanın iki yolu vardır:

1) Dahili fonksiyon sayısı ile ()

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

2) Bir işlev kullanmadan

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

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

print(count)

-2

Bu IMHO'dan daha fazla değil - üst veya alt yöntemleri ekleyebilirsiniz

def count_letter_in_str(string,letter):
    return string.count(letter)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.