একটি স্ট্রিংয়ে একটি অক্ষরের সংখ্যা উপস্থিতি গণনা করুন


953

কোন স্ট্রিংয়ে কোনও চরিত্রের উপস্থিতি সংখ্যা গণনা করার সহজ উপায় কী?

যেমন বারের সংখ্যাটি 'a'উপস্থিত হয় তা গণনা করুন'Mary had a little lamb'

উত্তর:


1331

স্ট্রিংকাউন্ট (উপ [, শুরু [, শেষ]]]

subপরিসরে সাবস্ট্রিংয়ের অ-ওভারল্যাপিং সংঘটনগুলির সংখ্যাটি প্রদান করুন [start, end]। Alচ্ছিক যুক্তিগুলি startএবং endস্লাইস নোটেশন হিসাবে ব্যাখ্যা করা হয়।

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


112

হিসাবে অন্যান্য উত্তর বললেন, স্ট্রিং পদ্ধতি COUNT (ব্যবহার) সম্ভবত সবচেয়ে সহজ, কিন্তু যদি এই ঘন ঘন করছি, খুঁজে বার করো collections.Counter :

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

15
ঘন ঘন ব্যবহার করার সময় এটি কেন ভাল? সুবিধা কী?
জালযুক্ত

21
আপনি যদি একটি প্রদত্ত স্ট্রিংয়ে প্রচুর অক্ষরের জন্য গণনা চান, তবে কাউন্টারগুলি সেগুলিকে আরও সংক্ষিপ্ত আকারে সরবরাহ করে। আপনি যদি অনেকগুলি স্ট্রিং থেকে একটি চিঠির জন্য গণনা চান তবে কাউন্টার কোনও সুবিধা দেয় না।
ব্রেন্ডেন ব্রাউন

2
এই নির্দিষ্ট উদাহরণের জন্য, অক্ষর গণনা করা, আমি সংগ্রহগুলি পছন্দ করব prefer একটি নির্দিষ্ট সাবস্ট্রিংয়ের উদাহরণ সন্ধানের জন্য, আমি একটি নিয়মিত অভিব্যক্তি বা str.count () পদ্ধতি ব্যবহার করব would আমি পরীক্ষা করিনি, তবে সমস্ত অক্ষর গণনা এবং কোনও একক স্ট্রাইংয়ের ঘটনা গণনা করার পরিবর্তে অভিধানে সংযোজন করার ক্ষেত্রে একটি সামান্য ওভারহেডের কারণে পারফরম্যান্সের পার্থক্য থাকতে পারে। আমি অনুসন্ধানের জন্য খুব দীর্ঘ একটি ফাইল তৈরি করতে এবং তারপরে প্রতিটি পদ্ধতির কার্যকর সময় নির্ধারণের জন্য একটি স্ক্রিপ্ট লেখার পরামর্শ দেব।
ড্যানিয়েল বি।

5
ঘন ঘন ব্যবহার করার পরে সুবিধাটি হ'ল কাউন্টারটি সমস্ত সময় গণনা করে এক সময়, যা প্রায় একবারে মাইস্ট্রিং.কাউন্ট ('এ') করার মতো দ্রুত। সুতরাং, আপনি যদি 20 বার এটি করেন, আপনি সম্ভবত গণনার সময় 10 বার সাশ্রয় করছেন। কাউন্টারটি আপনাকে কোনও আইটেমের স্ট্রিংয়ে থাকলে তাও বলতে পারে: উদাহরণস্বরূপ, যদি কাউন্টারে 'এ' থাকে:
বিএএমএফ 4 ব্যাকন

51

নিয়মিত প্রকাশ হতে পারে?

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

30
একটি সূক্ষ্ম ধারণা, তবে এক্ষেত্রে ওভারকিল। স্ট্রিং পদ্ধতি 'গণনা' এটি কী করছে তা অবিলম্বে সুস্পষ্ট হওয়ার যুক্ত বোনাসের সাথে একই কাজ করে।
নীলামো

18
নেতিবাচক হার কেন, কারওর জন্য অনুরূপ কোনও কিছুর জন্য এই জাতীয় কোডের প্রয়োজন। আমার ভোট আপ
কিলটেক

12
এটি ডাউনভোট হওয়া উচিত কারণ স্ট্রিংয়ে অক্ষর গণনা করা সবচেয়ে কম দক্ষ উপায়। যদি লক্ষ্যটি কেবল চরিত্রগুলি গণনা করা হয়, যেমন প্রশ্নটি ইঙ্গিত করে, কাজটি করার আরও খারাপ উপায় খুঁজে পাওয়া শক্ত হবে। মেমরি এবং প্রসেসরের ওভারহেডের ক্ষেত্রে, এই সমাধানটি অবশ্যই এড়ানো উচিত। স্ট্রিংয়ের অক্ষরগুলির গণনা খুঁজে পাওয়ার জন্য এই পদ্ধতিটি ব্যবহার করার জন্য আর কারও "প্রয়োজন" হবে না।
ক্রিস্টোফার

1
@ কিলটেক প্রকৃতপক্ষে, এই ছোট স্নিপেটটি আমার কাছে নিয়মিত অভিব্যক্তিটি আরও জটিল করে
তোলে

স্ট্রিং পদ্ধতিগুলি উপলভ্য না থাকলে ভাল সমাধান:len(re.findall('1',bin(10)))
কনর


16

পাইথন-3.x:

"aabc".count("a")

স্ট্রিংকাউন্ট (উপ [, শুরু [, শেষ]]]

পরিসরে সাবস্ট্রিং সাব-অ-ওভারল্যাপিং সংঘটনগুলির সংখ্যা [শুরু, শেষ] সরিয়ে দিন। Ptionচ্ছিক আর্গুমেন্ট শুরু এবং শেষটি স্লাইস নোটেশনের মতো ব্যাখ্যা করা হয়।


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
মার্ভ 21

@ এমআরভি সত্যই নয় 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))

সচেতন থাকুন যে রেজেক্স সংস্করণটি দশ মিনিটের ক্রম হিসাবে চালিত হতে চলেছে, এটি সম্ভবত তখনই সমস্যা হয়ে দাঁড়াবে যদি মাই_স্ট্রিংটি অত্যন্ত দীর্ঘ হয়, বা কোডটি একটি গভীর লুপের অভ্যন্তরে থাকে।


1
যদি আপনি কেবল কেস সংবেদনশীলতা ঠিক করার চেষ্টা করছেন তবে রেগেক্স ওভারকিল। my_sting.lower ()। গণনা ('মি') আরও পারফরম্যান্ট, আরও পরিষ্কার, এবং আরও সংক্ষিপ্ত।
ওগ্রে


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এবং 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

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
খালি গণনার কাজ কেন? কেন মূল () ফাংশন? সব জায়গায় কুরুচিপূর্ণ জায়গা কেন? এটি একটি ভাল উত্তর নয়।
বাগম্যানট 123

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

পাইথন ঘ

এটি অর্জনের দুটি উপায়:

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

এই আইএমএইচও ছাড়া আর কোনও নয় - আপনি উপরের বা নিম্ন পদ্ধতিগুলি যুক্ত করতে পারেন

def count_letter_in_str(string,letter):
    return string.count(letter)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.