Zählen Sie die Anzahl der Vorkommen eines Zeichens in einer Zeichenfolge


954

Was ist der einfachste Weg, um die Anzahl der Vorkommen eines Zeichens in einer Zeichenfolge zu zählen?

zB zählen, wie oft in 'a'erscheint'Mary had a little lamb'

Antworten:


1332

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

Gibt die Anzahl der nicht überlappenden Vorkommen von Teilzeichenfolgen subim Bereich zurück [start, end]. Optionale Argumente startund endwerden wie in Slice-Notation interpretiert.

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


112

Wie andere Antworten bereits sagten, ist die Verwendung der Zeichenfolgenmethode count () wahrscheinlich die einfachste. Wenn Sie dies jedoch häufig tun, lesen Sie die Sammlungen. Counter :

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

15
Warum ist das besser, wenn es häufig verwendet wird? Was ist der Vorteil?
Meshy

21
Wenn Sie die Anzahl der Buchstaben in einer bestimmten Zeichenfolge angeben möchten, bietet Counter sie alle in einer prägnanteren Form. Wenn Sie die Anzahl für einen Buchstaben aus vielen verschiedenen Zeichenfolgen zählen möchten, bietet Counter keinen Vorteil.
Brenden Brown

2
Für diesen speziellen Fall, in dem Zeichen gezählt werden, würde ich collection.counter bevorzugen. Um Instanzen eines bestimmten Teilstrings zu finden, würde ich einen regulären Ausdruck oder die Methode str.count () verwenden. Ich habe nicht getestet, aber es kann einen Leistungsunterschied geben, da beim Zählen aller Zeichen und beim Anhängen an ein Wörterbuch ein geringer Aufwand anfällt, anstatt das Auftreten eines einzelnen Teilstrings zu zählen. Ich würde vorschlagen, ein Skript zu schreiben, um eine sehr lange Datei für die Suche zu generieren und dann die Ausführung jeder Methode zu planen.
Daniel B.

5
Der Vorteil bei häufiger Verwendung besteht darin, dass Counter alle Zählungen EINMAL berechnet, was fast so schnell ist wie die einmalige Ausführung von mystring.count ('a'). Wenn Sie dies also 20 Mal tun, sparen Sie möglicherweise das 10-fache der Rechenzeit. Der Zähler kann Ihnen auch sagen, ob sich ein Element in der Zeichenfolge befindet: Zum Beispiel, wenn 'a' im Zähler:
BAMF4bacon

51

Reguläre Ausdrücke vielleicht?

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

30
Eine gute Idee, aber in diesem Fall übertrieben. Die String-Methode 'count' macht dasselbe mit dem zusätzlichen Bonus, sofort klar zu sein, was sie tut.
Nilamo

18
Warum negative Rate, vielleicht braucht jemand diese Art von Code für etwas Ähnliches. meine Stimme nach oben
Kiltek

12
Dies sollte herabgestuft werden, da dies die am wenigsten effiziente Möglichkeit ist, Zeichen in einer Zeichenfolge zu zählen. Wenn das Ziel einfach darin besteht, Zeichen zu zählen, wie die Frage zeigt, ist es schwierig, einen schlechteren Weg zu finden, um die Arbeit zu erledigen. In Bezug auf Speicher- und Prozessor-Overhead ist diese Lösung definitiv zu vermeiden. Niemand wird jemals diese Methode "brauchen" müssen, um die Anzahl der Zeichen in einer Zeichenfolge zu ermitteln.
Christopher

1
@ Kiltek In der Tat war dieses kleine Snippet für mich mit einem regulären Ausdruck etwas komplexer
Speccy

Gute Lösung, wenn keine String-Methoden verfügbar sind:len(re.findall('1',bin(10)))
Conor


16

Python-3.x:

"aabc".count("a")

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

Geben Sie die Anzahl der nicht überlappenden Vorkommen von Teilzeichenfolgen im Bereich [Start, Ende] zurück. Optionale Argumente start und end werden wie in der Slice-Notation interpretiert.


13

str.count(a)ist die beste Lösung, um ein einzelnes Zeichen in einer Zeichenfolge zu zählen. Wenn Sie jedoch mehr Zeichen zählen müssen, müssen Sie die gesamte Zeichenfolge so oft lesen, wie Sie zählen möchten.

Ein besserer Ansatz für diesen Job wäre:

from collections import defaultdict

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

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

Sie haben also ein Diktat, das die Anzahl der Vorkommen jedes Buchstabens in der Zeichenfolge zurückgibt und 0falls dieser nicht vorhanden ist.

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

Bei einem Zähler ohne Berücksichtigung der Groß- und Kleinschreibung können Sie die Mutator- und Accessor-Methoden durch Unterklassen überschreiben defaultdict(die Basisklassen sind schreibgeschützt):

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

Sie implementieren im Grunde genommen neu Counter, was bereits eine Klasse ist collections.
Merv

@merv Nicht wirklich. Counterist eine mehr aufgebläht reine Python - Klasse und defaultdict‚s __missing__ist in C geschrieben . Für eine einfache Aufgabe wie diese ( intwird auch in C implementiert) ist dieser Ansatz etwas schneller.
Nuno André

11

Diese einfache und unkomplizierte Funktion könnte helfen:

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
Du beschattest str. Wenn Sie der Variablen ihren Namen geben, strhandelt es sich nicht mehr um einen integrierten Typ. Außerdem zählst du vierzehn Mal vierzehn b. Sie können das einfach vermeiden , indem Sie for c in textmit for c in set(text).
Nuno André

10

Reguläre Ausdrücke sind sehr nützlich, wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen möchten (und natürlich die ganze Kraft von 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))

Beachten Sie, dass die Ausführung der Regex-Version zehnmal so lange dauert. Dies ist wahrscheinlich nur dann ein Problem, wenn my_string enorm lang ist oder sich der Code in einer tiefen Schleife befindet.


1
Regex ist übertrieben, wenn Sie nur versuchen, die Groß- und Kleinschreibung zu korrigieren. my_sting.lower (). count ('m') ist performanter, klarer und prägnanter.
Oger-Codes

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

Eine alternative Möglichkeit , alle Zeichen zählt zu erhalten , ohne Counter(), countund 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

countist definitiv die präziseste und effizienteste Methode, um das Auftreten eines Zeichens in einer Zeichenfolge zu zählen, aber ich habe versucht, eine Lösung zu finden lambda, die Folgendes verwendet:

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

Dies führt zu:

4

Es gibt noch einen weiteren Vorteil: Wenn der Satz eine Liste von Teilzeichenfolgen ist, die dieselben Zeichen wie oben enthalten, ergibt dies aufgrund der Verwendung von auch das richtige Ergebnis in. Guck mal :

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

Dies führt auch zu:

4

Dies funktioniert natürlich nur, wenn das Auftreten eines einzelnen Zeichens überprüft wird, wie 'a'in diesem speziellen Fall.


0

"Ohne count zu verwenden, um das gewünschte Zeichen in der Zeichenfolge zu finden" -Methode.

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
Warum die Leerzählfunktion? Warum die main () Funktion? Warum die hässlichen Räume überall? Dies ist keine gute Antwort.
Bugmenot123

0

Ich bin ein Fan der Pandas-Bibliothek, insbesondere der value_counts()Methode. Sie können es verwenden, um das Vorkommen jedes Zeichens in Ihrer Zeichenfolge zu zählen:

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

Es gibt zwei Möglichkeiten, dies zu erreichen:

1) Mit eingebauter Funktion count ()

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

2) Ohne Verwendung einer Funktion

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

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

print(count)

-2

Nicht mehr als diese IMHO - Sie können die oberen oder unteren Methoden hinzufügen

def count_letter_in_str(string,letter):
    return string.count(letter)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.