किसी स्ट्रिंग में किसी वर्ण की संख्या घटाना


953

एक स्ट्रिंग में एक चरित्र के होने की संख्या को गिनने का सबसे सरल तरीका क्या है?

उदाहरण के लिए समय की संख्या में 'a'प्रकट होता है'Mary had a little lamb'

जवाबों:


1331

str.count (उप [, प्रारंभ [, अंत]])

subश्रेणी में प्रतिस्थापन की गैर-अतिव्यापी घटनाओं की संख्या लौटाएं [start, end]। वैकल्पिक तर्क startऔर endस्लाइस अंकन के रूप में व्याख्या की जाती है।

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


112

जैसा कि अन्य जवाबों में कहा गया है, स्ट्रिंग विधि गणना () का उपयोग करना शायद सबसे सरल है, लेकिन यदि आप इसे अक्सर कर रहे हैं, तो संग्रह देखें। रिकॉर्ड :

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

15
बार-बार इस्तेमाल किए जाने पर यह बेहतर क्यों है? फायदा क्या है?
मेष राशि

21
यदि आप दिए गए स्ट्रिंग में बहुत सारे अक्षरों के लिए गिनती चाहते हैं, तो काउंटर उन सभी को अधिक रसीले रूप में प्रदान करता है। यदि आप बहुत सारे अलग-अलग तारों से एक अक्षर के लिए गिनती चाहते हैं, तो काउंटर कोई लाभ नहीं प्रदान करता है।
ब्रेंडेन ब्राउन

2
इस विशेष उदाहरण के लिए, वर्णों की गिनती करते हुए, मैं collection.counter पसंद करूंगा। एक विशिष्ट विकल्प के उदाहरण खोजने के लिए, मैं एक नियमित अभिव्यक्ति या str.count () पद्धति का उपयोग करूंगा। मैंने परीक्षण नहीं किया है, लेकिन सभी पात्रों की गिनती करने और एक एकल प्रतिस्थापन की घटनाओं की गिनती करने के बजाय एक शब्दकोश में संलग्न करने के लिए एक मामूली ओवरहेड के कारण एक प्रदर्शन अंतर हो सकता है। मैं खोज करने के लिए एक स्क्रिप्ट लिखने का सुझाव दूंगा और प्रत्येक विधि के निष्पादन के लिए एक बहुत लंबी फ़ाइल तैयार करूंगा।
डैनियल बी।

5
बार-बार उपयोग किए जाने पर लाभ यह है कि काउंटर सभी काउंट वन टाइम की गणना करता है, जो लगभग एक बार मिस्ट्रीरिंग (एक ') करने के रूप में तेजी से होता है। इस प्रकार, यदि आप ऐसा 20 बार करते हैं, तो आप गणना समय की 10 गुना बचत कर सकते हैं। काउंटर यह भी बता सकता है कि क्या कोई वस्तु स्ट्रिंग में है: उदाहरण के लिए, यदि 'a' काउंटर में:
BAMF4bacon

51

नियमित अभिव्यक्ति शायद?

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

30
एक अच्छा विचार है, लेकिन इस मामले में ओवरकिल। स्ट्रिंग विधि 'काउंट' वही करता है जो जोड़े गए बोनस के साथ तुरंत करता है कि वह क्या कर रहा है।
निलमो

18
नकारात्मक दर क्यों, शायद किसी को कुछ इसी तरह के कोड की आवश्यकता है। मेरा वोट अप
किल्टेक

12
इसे कम किया जाना चाहिए क्योंकि यह एक स्ट्रिंग में वर्णों को गिनने के लिए कम से कम कुशल तरीका है। यदि लक्ष्य केवल वर्णों को गिनना है, जैसा कि प्रश्न इंगित करता है, तो काम करने के लिए एक बदतर तरीका खोजना मुश्किल होगा। स्मृति और प्रोसेसर ओवरहेड के संदर्भ में, इस समाधान से निश्चित रूप से बचा जाना चाहिए। किसी स्ट्रिंग में वर्णों की गिनती खोजने के लिए इस पद्धति का उपयोग करने के लिए किसी को कभी भी "आवश्यकता" नहीं होगी।
क्रिस्टोफर

1
@kiltek वास्तव में, यह छोटा सा स्निपेट मेरे लिए एक नियमित अभिव्यक्ति के साथ कुछ अधिक जटिल रहा है
Specific

अच्छा उपाय जब स्ट्रिंग विधियाँ उपलब्ध नहीं हैं:len(re.findall('1',bin(10)))
कॉनर


16

अजगर-3.x:

"aabc".count("a")

str.count (उप [, प्रारंभ [, अंत]])

सीमा में सबरिंग उप की गैर-अतिव्यापी घटनाओं की संख्या लौटाएं [प्रारंभ, अंत]। वैकल्पिक तर्क शुरू और अंत में स्लाइस अंकन के रूप में व्याख्या की जाती है।


13

str.count(a)एक स्ट्रिंग में एकल वर्ण की गणना करने के लिए सबसे अच्छा समाधान है। लेकिन अगर आपको अधिक वर्णों की गणना करने की आवश्यकता है तो आपको पूरे स्ट्रिंग को पढ़ना होगा जितनी बार आप जितने वर्णों को गिनना चाहते हैं।

इस काम के लिए एक बेहतर तरीका होगा:

from collections import defaultdict

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

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

तो आपके पास एक तानाशाही होगी जो स्ट्रिंग में प्रत्येक अक्षर की घटनाओं की संख्या लौटाती है और 0यदि यह मौजूद नहीं है।

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

असंवेदनशील काउंटर के लिए आप सबक्लासिंग द्वारा बेसक और एक्सेसर विधियों को ओवरराइड कर सकते हैं defaultdict(बेस क्लास 'केवल पढ़ने के लिए हैं):

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

आप मूल रूप से लागू कर रहे हैं Counter, जो पहले से ही एक वर्ग है collections
मर्व

@ मर्व वास्तव में नहीं। Counterएक और अधिक फूला हुआ शुद्ध पायथन वर्ग है और defaultdictकी __missing__है सी में लिखे । इस तरह के एक सरल कार्य के लिए ( intसी में भी लागू किया गया है) यह दृष्टिकोण थोड़ा तेजी से है।
नूनो एंड्रे

11

यह आसान और सीधे आगे का कार्य मदद कर सकता है:

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
तुम छाया कर रहे हो str। यदि आप चर को इसका नाम देते हैं, strतो बिल्ट-इन प्रकार नहीं है। साथ ही आप चौदह बी के चौदह बार गिन रहे हैं। आप बस के for c in textसाथ बदलकर इससे बच सकते हैं for c in set(text)
नूनो एंड्रे

10

यदि आप केस-इंसिडेंसिटी (और निश्चित रूप से रेगेक्स की सभी शक्ति) चाहते हैं तो नियमित अभिव्यक्ति बहुत उपयोगी है।

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

ज्ञात हो कि रेगेक्स संस्करण को चलने के लिए दस गुना लंबे समय के क्रम पर ले जाता है, जो संभवतः एक मुद्दा होगा जब my_string बहुत लंबे समय तक होता है, या कोड एक गहरे लूप के अंदर होता है।


1
यदि आप सिर्फ केस संवेदनशीलता को ठीक करने की कोशिश कर रहे हैं तो रेक्सक्स ओवरकिल है। my_sting.lower ()। count ('m') अधिक प्रदर्शन करने वाला, अधिक स्पष्ट और अधिक रसीला है।
ऑग्रे कोड्स


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

सभी वर्ण प्राप्त करने का एक वैकल्पिक तरीका बिना उपयोग किए Counter(), countऔर रेगेक्स है

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

countनिश्चित रूप से एक स्ट्रिंग में एक चरित्र की घटना को गिनने का सबसे संक्षिप्त और कुशल तरीका है, लेकिन मैंने एक समाधान का उपयोग करने की कोशिश की lambda, कुछ इस तरह से:

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

यह परिणाम होगा:

4

इसके अलावा, इसका एक और फायदा यह है कि यदि वाक्य उप-स्ट्रिंग की एक सूची है जिसमें ऊपर के समान वर्ण हैं, तो यह भी सही परिणाम देता है क्योंकि का उपयोग करता है in। एक नज़र देख लो :

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

यह भी परिणाम है:

4

लेकिन निश्चित रूप से यह केवल तभी काम करेगा जब 'a'इस विशेष मामले में एकल चरित्र की घटना की जांच हो ।


0

"आप स्ट्रिंग में विधि चाहते हैं यह खोजने के लिए गिनती का उपयोग किए बिना" विधि।

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
खाली गिनती समारोह क्यों? मुख्य () फ़ंक्शन क्यों? हर जगह बदसूरत स्थान क्यों? यह एक अच्छा जवाब नहीं है।
Bugmenot123

0

मैं विशेष रूप से पंडों के पुस्तकालय का प्रशंसक हूं value_counts()। आप अपने स्ट्रिंग में प्रत्येक वर्ण की घटना को गिनने के लिए इसका उपयोग कर सकते हैं:

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

अजगर ३

इसे प्राप्त करने के दो तरीके हैं:

1) में निर्मित समारोह गिनती () के साथ

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

2) एक फ़ंक्शन का उपयोग किए बिना

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

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

print(count)

-2

इस IMHO से अधिक नहीं - आप ऊपरी या निचले तरीकों को जोड़ सकते हैं

def count_letter_in_str(string,letter):
    return string.count(letter)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.