পাইথনে স্ট্রিংয়ে একটি সংখ্যা রয়েছে কিনা তা পরীক্ষা করুন

ভূমিকা

আপনি ব্যবহারকারীর ইনপুটের জন্য একটি যাচাইকরণ স্ক্রিপ্ট তৈরি করছেন কিনা, একটি লগইন ফর্ম যা ব্যবহারকারীদের একটি পাসওয়ার্ডে একটি অক্ষর অন্তর্ভুক্ত করার অনুরোধ করে – একটি স্ট্রিং একটি অক্ষর রয়েছে কিনা তা পরীক্ষা করা একটি অস্বাভাবিক কাজ নয়৷

এই টিউটোরিয়ালে - আমরা শেষ পর্যন্ত সবচেয়ে কার্যকর পদ্ধতির জন্য একটি বেঞ্চমার্ক সহ পাইথনে একটি স্ট্রিং-এ একটি সংখ্যা/সংখ্যা রয়েছে কিনা তা পরীক্ষা করতে আপনি অনেক উপায়ে দেখে নেব।

পাইথনে স্ট্রিং নম্বর রয়েছে কিনা তা পরীক্ষা করুন

একটি কিনা তা পরীক্ষা করার একাধিক উপায় আছে চরিত্র একটি সংখ্যা (ord(), isnumeric(), isdigit()), যা আপনি একটি ফর-লুপ দিয়ে জোড়া করতে পারেন, অন্তত একটি একক ইতিবাচক হিট পরীক্ষা করতে। বিকল্পভাবে, আপনি রেগুলার এক্সপ্রেশনগুলিকে সাধারণ প্যাটার্ন ম্যাচার হিসাবে ব্যবহার করতে পারেন, যা নমনীয়, শক্তিশালী এবং টেক্সটের বড় অংশে প্রয়োগ করার জন্য ডিজাইন করা হয়েছে। অবশেষে - আপনি সবসময় করতে পারেন map() প্রতিটি অক্ষর একটি শর্তসাপেক্ষ বিবৃতি দেওয়া, এবং ফিরে True is any() তাদের ফলাফল True.

এইগুলির মধ্যে নির্বাচন করার ক্ষেত্রে পদ্ধতিগুলির দক্ষতা, শব্দচয়ন এবং কোডিং শৈলী, সেইসাথে অপারেশনের সাথে যুক্ত আপস্ট্রিম বা ডাউনস্ট্রিম কাজগুলি বিবেচনা করা উচিত।

স্ট্রিংয়ে ord() সহ সংখ্যা রয়েছে কিনা তা পরীক্ষা করুন

সার্জারির ord() ফাংশন একটি অক্ষর নেয় এবং এটি প্রদান করে হওয়া ASCII মান:

print(ord('0')) 
print(ord('9')) 

এর ASCII মান 0 হল 48, এবং এর ASCII মান 9 হল 57। এর মধ্যে যেকোন সংখ্যা, এক্সটেনশন দ্বারা হবে, 48 এবং 57 এর মধ্যে একটি ASCII মান আছে. এখন স্ট্রিংটির কোনো সংখ্যা আছে কিনা তা পরীক্ষা করার জন্য, আমরা পুরো ইনপুট স্ট্রিংটি অতিক্রম করব এবং প্রতিটি অক্ষরের ASCII মান পরীক্ষা করব, যদি ASCII মান 47-এর বেশি এবং 58-এর কম হয়, এর মানে হল এটি একটি সংখ্যা, এবং আমরা ফিরে আসব। True:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    ascii_code = ord(ch)
    if 47 < ascii_code < 58:
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

এর ফলে:

Yes, the string contains a number.

স্ট্রিং-এ isnumeric() সহ সংখ্যা রয়েছে কিনা তা পরীক্ষা করুন

সার্জারির isnumeric() ফাংশন রিটার্ন True যদি ইনপুট স্ট্রিং শুধুমাত্র সংখ্যা ধারণ করে, অন্যথায়, এটি ফিরে আসে False:

str1 = "918"
print("String is whole numeric?", str1.isnumeric())
str2 = "The meaning of the universe is 42"
print("String is whole numeric?", str2.isnumeric())

এর ফলে:

String is whole numeric? True 
String is whole numeric? False

বিঃদ্রঃ: সার্জারির isnumeric() ফাংশন আপনি আশা করতে পারেন হিসাবে আচরণ করবে না ঋণাত্মক বা ভাসমান সংখ্যা. যদি আমরা শুধুমাত্র ঋণাত্মক বা ফ্লোট সংখ্যা সহ একটি স্ট্রিং পাস করি, এটি ফিরে আসবে False, কারণ - এবং . নেতিবাচক সংখ্যা এবং ফ্লোটগুলির সাথে যুক্ত অক্ষরগুলি প্রকৃতপক্ষে সংখ্যা নয়।

str1 = "-918"
print("String is whole numeric?", str1.isnumeric()) 

str2 = "91.8"
print("String is whole numeric?", str2.isnumeric()) 

যদিও, যেহেতু অক্ষরগুলি পাইথনে দৈর্ঘ্য 1 এর স্ট্রিং - আপনি অক্ষরগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন এবং ব্যবহার করতে পারেন isnumeric() তারা একটি সংখ্যা কিনা তা পরীক্ষা করতে:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isnumeric():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

স্ট্রিং-এ isdigit() সহ সংখ্যা রয়েছে কিনা তা পরীক্ষা করুন

সার্জারির isdigit() ফাংশন একটি স্ট্রিং এর সমস্ত অক্ষর সংখ্যা কিনা তা পরীক্ষা করে। যদি হ্যাঁ - এটি ফিরে আসে True, এবং যদি না হয়, এটি ফিরে আসে False. আবার, যেহেতু অক্ষরগুলি পাইথনে দৈর্ঘ্য 1 এর স্ট্রিং - এই পদ্ধতিটি প্রতিটি অক্ষরের জন্য একটি লুপে ব্যবহার করা যেতে পারে:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isdigit():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

বিঃদ্রঃ: সার্জারির isdigit() পদ্ধতি শুধুমাত্র একই পদ্ধতিতে আচরণ করে isnumeric(), এবং যদি আপনি একটি ফ্লোট বা একটি ঋণাত্মক সংখ্যা ধারণকারী একটি স্ট্রিং পাস করেন, False বিশেষ অক্ষর সংখ্যা না হওয়ার কারণে ফেরত দেওয়া হয়। একটি চরিত্র-স্তরে, যদিও, যদি এক হিসাবে দীর্ঘ True স্ট্রিংটিতে একটি সংখ্যা আছে কিনা তা নির্ধারণ করার জন্য মান যথেষ্ট - এটি প্রযোজ্য।

isnumeric() এবং isdigit() এর মধ্যে পার্থক্য?

সুতরাং, মধ্যে পার্থক্য কি isnumeric() এবং isdigit()? যখন আমরা এটা করছি - কি সম্পর্কে isdecimal()?

  • isnumeric() কোনো অক্ষর আছে কিনা তা পরীক্ষা করে ইউনিকোড উপস্থাপনা একটি সংখ্যামান (যাতে রোমান সংখ্যাসূচক উপস্থাপনা, সুপারস্ক্রিপ্ট, সাবস্ক্রিপ্ট এবং ভগ্নাংশ অন্তর্ভুক্ত)
  • isdigit() কোনো অক্ষর আছে কিনা তা পরীক্ষা করে ইউনিকোড সংখ্যা (যা রোমান সংখ্যাসূচক উপস্থাপনা অন্তর্ভুক্ত করে না, তবে সুপার/সাবস্ক্রিপ্ট এবং ভগ্নাংশ অন্তর্ভুক্ত করে)
  • isdecimal() কোনো অক্ষর আছে কিনা তা পরীক্ষা করে দশমিক সংখ্যা (যা ফিরে আসবে False এমন কিছুর জন্য যা নয় 0..9 বেস 10 এ)

isnumeric() সবচেয়ে বিস্তৃত পদ্ধতি, যখন isdecimal() তিনটির মধ্যে সবচেয়ে সংকীর্ণ।

মানচিত্র() এবং যেকোনো() সহ স্ট্রিংয়ে নম্বর রয়েছে কিনা তা পরীক্ষা করুন

সার্জারির map() ফাংশন ম্যাপ ফাংশনে পাস করা পুনরাবৃত্তিযোগ্য প্রতিটি উপাদানের জন্য প্রদত্ত ফাংশন চালায়। একটি পুনরাবৃত্তিযোগ্য প্রতিটি উপাদান একটি প্যারামিটার হিসাবে ফাংশনে পাস করা হয়:

map(function, iterable)

সার্জারির function প্রতিটি আইটেমের জন্য মৃত্যুদন্ড কার্যকর করা হয় iterable. এটি খুব নমনীয় এবং শক্তিশালী যুক্তির জন্য অনুমতি দেয়, শুধুমাত্র এর ব্যাপকতা দ্বারা আবদ্ধ function আপনি ইনপুট কল! পদ্ধতিটি একটি রিটার্ন করে map উদাহরণ, যা সহজেই অন্যান্য সংগ্রহে পরিণত করা যেতে পারে যেমন একটি তালিকা বা সেট।

আমরা একটি ফাংশন লিখতে পারি যা একটি বুলিয়ান রিটার্ন করে যেটি একটি অক্ষর একটি সংখ্যা কিনা এবং map() কলের ফলে বুলিয়ান মানগুলির একটি তালিকা তৈরি হবে।

সার্জারির any() আয় True যদি পাস করা পুনরাবৃত্তিযোগ্য কোনো উপাদান হয় True, অন্যথায়, এটি ফিরে আসে False.

এই দুটিকে একসাথে স্ট্রিং করে - আমরা একটি উচ্চ-স্তরের, সংক্ষিপ্ত স্ক্রিপ্ট তৈরি করতে পারি এবং ফর-লুপকে বিমূর্ত করতে পারি:

def func(ch):
    return ch.isdigit() 

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(func, input_string)))
print("Is there a number present?", contains_number)

এর ফলে:

Is there a number present? True

যদি আপনার ফাংশনটি একটি ওয়ান-লাইনার হয় - একটি নামযুক্ত ফাংশন হিসাবে এটি বের করার দরকার নেই। আপনি একটি বেনামী লিখতে পারেন ল্যাম্বডা ফাংশন পরিবর্তে সংক্ষিপ্ততার জন্য:

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(lambda ch: ch.isdigit(), input_string)))
print("Is there any number present?", contains_number)

এর ফলেও:

Is there any number present? True

নিয়মিত এক্সপ্রেশন সহ পাইথনে স্ট্রিং-এ নম্বর রয়েছে কিনা তা পরীক্ষা করুন

রেগুলার এক্সপ্রেশন হয় অনুসন্ধান নিদর্শন ইনপুট পাঠ্যের সাথে মিলে যাওয়ার জন্য ডিজাইন করা হয়েছে। এগুলি নমনীয় এবং তাদের প্রকৃতি দেওয়া হয়েছে – আপনি অনুসন্ধানের জন্য একই প্যাটার্নের জন্য একটি ইচ্ছামত সংখ্যক অভিব্যক্তি লিখতে পারেন, সেইসাথে আপনি ভাবতে পারেন এমন যে কোনও ট্র্যাক্টিবল প্যাটার্ন কভার করতে পারেন।

পাইথনের re মডিউলটি রেগুলার এক্সপ্রেশনের বিপরীতে টেক্সট লিখতে, কম্পাইল করতে এবং মেলাতে ব্যবহৃত হয়। এটি বিভিন্ন পদ্ধতি উন্মুক্ত করে, যেমন match() একটি স্ট্রিং একটি প্যাটার্ন দিয়ে শুরু হয় কিনা তা মেলে, search() যা একটি স্ট্রিং-এ সম্ভবত অনেক ম্যাচের প্রথম ঘটনা খুঁজে পায়, এবং findall() যা সমস্ত ঘটনার জন্য চেক করে।

বিঃদ্রঃ: তিনটি পদ্ধতিই ক pattern এবং search তর্ক এবং জন্য একটি অনুসন্ধান চালান pattern মধ্যে search স্ট্রিং।

যে প্যাটার্নটি চিহ্নিত করে a অঙ্ক is "d+":

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.search(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

সার্জারির search() পদ্ধতি a re.Match বস্তু, মিল পাওয়া গেছে এবং শুরু এবং শেষ সূচক রয়েছে:


বস্তুটি একটি বুলিয়ান মান মূল্যায়ন করা যেতে পারে যে এটি একটি কিনা তার উপর ভিত্তি করে re.Match বস্তু বা None. এর ফলে:

Is there any number present? Yes

এর বিপরীতে search() পদ্ধতি, findall() পদ্ধতিটি শুধুমাত্র প্রথমটির পরিবর্তে প্যাটার্নের সমস্ত ঘটনা ফেরত দেয়:

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.findall(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

এর ফলে:

Is there any number present? Yes

মাপকাঠিতে

কর্মক্ষমতা সম্পর্কে কি? আপনি যদি যুক্তি বের করেন এবং অপ্রয়োজনীয় অংশগুলিকে ছাঁটাই করেন, পদ্ধতিগুলিকে শুধুমাত্র ফলাফল ফেরানোর জন্য সীমিত করেন, আপনি একই ইনপুটে সহজেই সেগুলিকে অন্যটির বিপরীতে বেঞ্চমার্ক করতে পারেন:

%timeit ord_check()
%timeit isnumeric_check()
%timeit is_digit_check()
%timeit lambda_check()
%timeit regex_check()

এর ফলে:

2.18 µs ± 51.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
2.04 µs ± 639 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
1.88 µs ± 448 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
5.07 µs ± 915 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
1.47 µs ± 3.41 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

সাধারণত ফর-লুপ পদ্ধতিগুলি নির্দিষ্ট পদ্ধতি থেকে সামান্য ওভারহেড সহ একই সময়ে চলে। সঙ্গে Lambda any() ডিফ্যাক্টো সবচেয়ে ধীরগতির (অনেক অপ্রয়োজনীয় ক্রিয়াকলাপ, একটি তালিকাকে একটি তালিকায় রূপান্তরিত করার কারণে এবং তারপরে এটি হ্রাস করার কারণে), যখন রেগুলার এক্সপ্রেশনগুলির চারপাশে সর্বনিম্ন বৈচিত্র্য সহ দ্রুততম রানটাইম ছিল (এগুলি ধারাবাহিকভাবে দ্রুত)।

যাইহোক, দীর্ঘতর ইনপুট টেক্সটগুলিতে, বিভিন্ন পদ্ধতির প্রতিটিতে সময় জটিলতার উপর জোর দেওয়া হয়, বিশেষ করে মিলে যাওয়া অঙ্কের সংখ্যার উপর নির্ভর করে (অঙ্কগুলি সাধারণ হোক বা না হোক):

import random
import string

input_string_random = ''.join(random.choices(string.ascii_uppercase + string.digits, k=1000))
print(input_string_random) 

input_string_with_single_digit = ''.join(random.choices(string.ascii_uppercase, k=1000)) + '1'
print(input_string_with_single_digit) 

প্রথম স্ট্রিংটি প্রায় সমান সংখ্যক সংখ্যা এবং অক্ষর সহ একটি এলোমেলো ক্রম তৈরি করে, যখন শেষেরটি একটি অক্ষর-শুধুমাত্র স্ট্রিং যার শেষে একটি একক সংখ্যা থাকে (সবচেয়ে খারাপ সময় জটিলতা):

%timeit ord_check(input_string_random)
504 ns ± 22.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit ord_check(input_string_with_single_digit)
76.2 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit isnumeric_check(input_string_random)
756 ns ± 170 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit isnumeric_check(input_string_with_single_digit)
76.2 µs ± 8.43 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit is_digit_check(input_string_random)
549 ns ± 102 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit is_digit_check(input_string_with_single_digit)
65 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_random)
114 µs ± 8.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_with_single_digit)
119 µs ± 6.23 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit regex_check(input_string_random)
996 ns ± 19.8 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit regex_check(input_string_with_single_digit)
22.2 µs ± 1.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

হিট সংখ্যা কম - নিয়মিত এক্সপ্রেশন সবচেয়ে পারফরম্যান্স হয়. অনেক হিটের সাথে, ল্যাম্বডা ফাংশন পদ্ধতিটি সবচেয়ে কার্যকরী এবং এটি তার সময় জটিলতা ধরে রাখে ইনপুট অনেক হিট বা একটি আছে কিনা নির্বিশেষে. প্রধান নেতিবাচক দিক (অপ্রয়োজনীয় গণনা যখন আঘাতের হার কম হয়) এটির প্রধান শক্তিতে পরিণত হয় কারণ অপ্রয়োজনীয়তা এটিকে ইনপুটে শক্তিশালী করে তোলে।

উপসংহার

এই টিউটোরিয়ালে, আমরা পাইথনের একটি স্ট্রিংয়ে অন্তত একটি অক্ষর আছে কিনা তা পরীক্ষা করার একাধিক উপায় দেখেছি। আমরা কটাক্ষপাত করেছি ord(), isnumeric(), isdigit() এবং isdecimal() ফাংশন, সেইসাথে কিভাবে একটি ল্যাম্বডা ফাংশন কল ব্যবহার করে এই যুক্তিকে বিমূর্ত করা যায় map() এবং any(). তারপরে, আমরা নিয়মিত এক্সপ্রেশনগুলি অন্বেষণ করেছি এবং বিভিন্ন ইনপুট সহ পন্থাগুলিকে বেঞ্চমার্ক করেছি।

সময় স্ট্যাম্প:

থেকে আরো Stackabuse