وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

یافتن اعداد در انواع مختلف داده در پایتون

0 242
زمان لازم برای مطالعه: 10 دقیقه


معرفی

هنگام کار با پایتون، اغلب باید با داده هایی به شکل اعداد یا کلمات سروکار داشته باشیم. گاهی اوقات کلمات و اعداد در کنار هم ذخیره می شوند و نیازهای ما ما را مجبور می کند اعداد را از کلمات جدا کنیم.

در این مقاله روش تعریف کلمات و اعداد در پایتون را توضیح خواهیم داد. سپس، خواهیم دید که چگونه اعداد را از کلمات جدا کنیم، در صورتی که با هم ذخیره شوند، با استفاده از روش های مختلف و در موقعیت های مختلف.

رشته ها، اعداد صحیح و شناورها در پایتون

در پایتون، رشته ها، اعداد صحیح و شناورها انواع داده های اساسی هستند که برای نمایش انواع مختلف مقادیر در یک برنامه استفاده می شوند.

اعداد صحیح نشان دهنده اعداد صحیح بدون هیچ قسمت اعشاری هستند و می توانند مثبت یا منفی باشند. در اینجا روش تعریف یک عدد صحیح در پایتون آمده است:


age = 15

ما یک متغیر به نام ایجاد کرده ایم age و مقدار 15 را به آن اختصاص دادیم. برای تأیید نوع متغیر در پایتون، می توانیم از تابع داخلی استفاده کنیم. type(). اینجوری کار میکند:


type(age)

و دریافت می کنیم:

int

بنابراین، متغیر را پاس می کنیم age به عملکرد داخلی type() و به ما می گوید که این یک عدد صحیح است، همانطور که ما انتظار داشتیم.

برای بیان اعداد می توانیم از نوع float نیز استفاده کنیم. یک شناور که مختصر اعداد ممیز شناور است، اعداد واقعی را با اعشار نشان می دهد. آنها به طور کلی برای محاسبات علمی مناسب هستند، اما نه تنها. در اینجا روش تعریف شناور در پایتون آمده است:


pi = 3.14

و دوباره، برای بررسی نوع متغیر ما:


type(pi)

و دریافت می کنیم:

float

رشته‌ها دنباله‌ای از کاراکترها هستند که در گیومه‌های دوتایی یا تک گیومه محصور شده‌اند. از آنها برای ذخیره متن یا به طور کلی هر نوع کاراکتر استفاده می شود. این بدان معنی است که یک رشته حتی می تواند حاوی اعداد باشد که تمرکز این مقاله است. بنابراین، برای مثال، یک رشته می تواند:


my_name = "Federico"


type(my_name)

و دریافت می کنیم:

str

اما همچنین می تواند:


federico_car = 'Federico has 1 car'

در نهایت توجه کنید: گفتیم که رشته در پایتون هر کاراکتری است که در گیومه قرار گرفته باشد. این بدان معنی است که نوع موارد زیر است:


age = '15'

است str.

اکنون، با در نظر گرفتن این نمای کلی، بیایید روش هایی را برای رهگیری اعداد در داخل رشته ها ببینیم.

روش های یافتن اعداد در رشته ها

بیایید مروری بر برخی از روش‌هایی که می‌توانیم برای بررسی اینکه آیا یک رشته دارای اعداد است یا خیر، ببینیم.

را int() و شناور() مواد و روش ها

ساده ترین راه برای تبدیل رشته به عدد از طریق int() و float() مواد و روش ها. بیایید ببینیم چگونه می توانیم از آنها استفاده کنیم.

فرض کنید سن خود را به عنوان یک رشته بیان کرده ایم، اما آن را به عنوان یک عدد صحیح می خواهیم. ما می توانیم این کار را به این صورت انجام دهیم:


age = '30'


age_int = int(age)


type(age_int)

و داریم:

int

بنابراین، ما متغیر را تعریف کرده ایم age به عنوان یک رشته سپس آن را به عنوان استدلال روش ارسال کردیم int() و رشته را به یک عدد صحیح تبدیل کرد.

حال فرض کنید قیمتی را به صورت رشته بیان کرده ایم اما می خواهیم آن را به شناور تبدیل کنیم. ما می توانیم این کار را به این صورت انجام دهیم:


price = "34.99"


price_float = float(price)


type(price_float)

و داریم:

float

به همین ترتیب، مانند قبل، یک رشته را به متد ارسال می کنیم float() و آن را به یک شناور تبدیل می کند.

اکنون، استفاده از این روش ها آسان است، اما یک محدودیت قابل توجه دارد: آنها می توانند رشته ها را تنها در صورتی به اعداد تبدیل کنند که مقدار داخل نقل قول ها یک عدد باشد. بنابراین، برای درک بهتر، به مثال زیر توجه کنید:


apples = "21 apples"


apples_converted = int(apples)


type(apples_converted)

و دریافت می کنیم:

ValueError: invalid literal for int() with base 10: '21 apples'

این خطا به این معنی است که ما سعی می کنیم یک رشته را به یک عدد صحیح تبدیل کنیم، اما رشته را نمی توان به عنوان یک عدد صحیح معتبر تجزیه کرد. البته، اگر رشته‌ای را که فقط حاوی متن است تجزیه کنیم یا از آن استفاده کنیم، همین مشکل پیش می‌آید float() روش.

حال ممکن است یک سوال پیش بیاید: اگر متن رشته یک عدد صحیح را بیان کند و بخواهیم آن را به یک float تبدیل کنیم چه؟ و برعکس چطور؟ بیایید هر دو سناریو را بررسی کنیم:


price = "30.5"


price_int = int(price)


type(price_int)

و دریافت می کنیم:

ValueError: invalid literal for int() with base 10

بنابراین، ما قیمت یک شی را به صورت یک عدد اعشاری بیان کرده ایم (البته نوع یک رشته است!) و سعی کرده ایم آن را به یک عدد صحیح تبدیل کنیم. این امکان پذیر نیست، همانطور که خطا نشان می دهد.

حال بیایید مورد دیگر را ببینیم:


price = "30"


price_float = float(price)


type(price_float)

و دریافت می کنیم:

float

بنابراین، می توانیم رشته ای را که یک عدد کامل را بیان می کند به یک شناور تبدیل کنیم. در واقع اگر بخواهیم ببینیم پایتون چگونه این عدد را به صورت شناور بیان می کند، می توانیم print آی تی:


print(price_float)

و همانطور که ممکن است انتظار داشته باشیم، دریافت می کنیم:

30.0

در حال حاضر، این دو روش بسیار ابتدایی هستند و محدودیت هایی دارند، همانطور که دیدیم. به همین دلیل است که باید روش های دیگری را برای حل مشکل خود در موقعیت های کلی تر یاد بگیریم.

پیشنهاد می‌کنیم بخوانید:  خواندن از stdin در پایتون

را isdigit() روش

را isdigit() روش بررسی می کند که آیا همه کاراکترهای یک رشته رقمی هستند (0-9). برمی گردد True اگر رشته فقط شامل ارقام و False در غیر این صورت. بنابراین، اجازه دهید چند مثال را ببینیم:


letters_and_numbers = "Hello123"


letters = "Hello World"


numbers = "123456"

حالا بیایید از isdigit() روش:


print(letters_and_numbers.isdigit())
print(letters.isdigit())
print(numbers.isdigit())

و دریافت می کنیم:

False
False
True

بنابراین، برای استفاده از این روش، نام متغیری را که در حال تایید آن هستیم، می نویسیم و اضافه می کنیم .isdigit(). همانطور که انتظار داشتیم، نتایج نشان می دهد که تنها متغیر numbers شامل کاراکترهایی است که همه رقم هستند.

این روش خوب است، اما ما می توانیم در پایتون بهتر عمل کنیم. در واقع، فهرست کردن تمام مقادیر چاپ شده ممکن است برای خواندن مشکل شود. بنابراین، می‌توانیم کد بالا را به این صورت بهبود دهیم:


print(f"Is {letters_and_numbers} an only digit string? {letters_and_numbers.isdigit()}")
print(f"Is {letters} an only digit string? {letters.isdigit()}")
print(f"Is {numbers} an only digit string? {numbers.isdigit()}")

و دریافت می کنیم:

Is Hello123 an only digit string? False
Is Hello World an only digit string? False
Is 123456 an only digit string? True

بنابراین، در داخل print()، ما میتوانیم استفاده کنیم f قبل از دو نقل قول برای درج متغیرها در داخل براکت های فرفری {}. این به پایتون اجازه می دهد تا مقدار واقعی متغیری را که از میان براکت های فرفری عبور داده شده است، برگرداند. سپس، دانستن اینکه isdigit() متد یک بولی (True یا Falseکد بالا نتایج قابل خواندن تری را ارائه می دهد.

اکنون، اگر این روش بتواند اعداد را در رشته‌هایی که هم ارقام و هم سایر کاراکترها را شامل می‌شوند، شناسایی کند، مفید خواهد بود. برای دستیابی به این، می توانیم یک تابع مانند زیر ایجاد کنیم:


def contains_number(string: str) -> bool:
    return any(char.isdigit() for char in string)

بعد، ما عبور می کنیم letters_and_numbers متغیر به contains_number() عملکرد کنید و نتیجه را مشاهده کنید:


contains_number(letters_and_numbers)

و دریافت می کنیم:

True

دقیقاً همانطور که می خواستیم: ما توانستیم ارقام را در متغیری که شامل انواع مختلفی از کاراکترها است، رهگیری کنیم. حالا بیایید این تابع را مرحله به مرحله توضیح دهیم:

  1. def contains_number(string: str) -> bool به این معنی است که ما در حال تعریف تابعی به نام هستیم contains_number() جایی که ما انتظار استدلال را داریم که به طور کلی آن را نامیدیم stringرشته بودن (:str). سپس، می دانیم که تابع یک بولی (->bool). توجه داشته باشید که این نماد که “Type Hints” نام دارد از پایتون 3 به بعد در دسترس است و اجباری نیست. می توانستیم بنویسیم def contains_number(string): و عملکرد به درستی کار می کند. Type Hints فقط یک راه مفید برای اطلاع رسانی به کاربر است روی هنگام برخورد با توابع (و کلاس ها) چه نوع هایی را باید انتظار داشت، بنابراین نوعی “تسهیل کننده” است.

  2. حالا بیایید توضیح دهیم any(char.isdigit() for char in string) این همان چیزی است که تابع برمی گرداند. اول، ما یک عبارت مولد ایجاد کرده‌ایم (ژنراتور نوع خاصی از شی در پایتون است که به ما امکان می‌دهد دنباله‌ای از مقادیر را به صورت پویا تولید کنیم، بدون اینکه نیازی به ذخیره همه مقادیر به طور همزمان در حافظه داشته باشیم) char.isdigit() for char in string. این یک دنباله از مقادیر بولی ایجاد می کند، که نشان می دهد آیا هر کاراکتر در رشته یک رقم است یا خیر. به خصوص، for char in string روی هر کاراکتر تکرار می شود char در استدلال string، به تابع منتقل شد. سپس، char.isdigit() بررسی می کند که آیا شخصیت char یک رقم است در نهایت، any() تابع یک تابع داخلی پایتون است که یک تکرارپذیر را به عنوان آرگومان می گیرد و برمی گرداند True اگر حداقل یک عنصر در تکرارپذیر باشد True. برمی گردد False اگر همه عناصر باشند False. بنابراین، در نتیجه، any(char.isdigit() for char in string) ارزیابی می کند True اگر حداقل یک کاراکتر در رشته یک رقم باشد، و False در غیر این صورت.

حالا بیایید روش های دیگر را ببینیم.

استفاده از عبارات منظم

روش دیگری که می‌توانیم برای یافتن اینکه آیا یک رشته دارای یک عدد است استفاده کنیم، از طریق عبارات منظم است (همچنین “regex” نامیده می‌شود). عبارات منظم دنباله ای از کاراکترها هستند که به ما کمک می کنند الگوها را در متن مطابقت دهیم یا پیدا کنیم. در اینجا روش استفاده از این ماژول پایتون برای اهداف خود آمده است:

import re


letters_and_numbers = "Hello123 0.3"
letters = "Hello World"
numbers = "1 2 3 4 5 6 0.5"


print(bool(re.search(r'\d', letters_and_numbers)))
print(bool(re.search(r'\d', letters)))
print(bool(re.search(r'\d', numbers)))

و دریافت می کنیم:

True
False
True

بنابراین، ابتدا ما نیاز داریم import را re ماژول برای استفاده از عبارات منظم. سپس، ما می توانیم استفاده کنیم re.search() روش برای هر متغیر برای بررسی هر رقمی. در عبارات منظم، \d نشان دهنده هر کاراکتر رقمی است. بعد، ما آن را اعمال می کنیم bool() متد، که یک مقدار بولی را برمی گرداند. اگر در رشته ای که بررسی می کنیم رقمی وجود داشته باشد، دریافت می کنیم True.

توجه داشته باشید که در مقایسه با روش قبلی، این روش اعداد را بدون استفاده از تابع شناسایی می کند. این روش همچنین عدد اعشاری را در رشته تشخیص می دهد letters_and_numbers، بر خلاف روش قبلی که فقط ارقام را تشخیص می دهد (اعداد از 0 تا 9). در پاراگراف بعدی بیشتر در این مورد توضیح خواهیم داد.

حال بیایید آخرین روش را بررسی کنیم.

را isnumeric() روش

را isnumeric() روش دقیقاً مانند isdigit() روش: برمی گردد True اگر همه کاراکترهای رشته اعداد باشند. تفاوت این دو در این است isnumeric() می تواند طیف وسیع تری از اعداد مانند شناور، کسر، فوق نویس، زیرنویس و غیره را شناسایی کند. بنابراین، اگر آگاه باشیم که به دنبال اعدادی هستیم که می توانند به اشکال مختلف باشند، پس isnumeric() باید ترجیح داده شود.

پیشنهاد می‌کنیم بخوانید:  روش استفاده از انواع داده در پایتون – با مثال کد توضیح داده شده است

در سمت کدنویسی، ما از آن به طور مشابه استفاده می کنیم isdigit() روش. بیایید یک مثال ساده را ببینیم:


letters_and_numbers = "Hello123"
letters = "Hello World"
numbers = "1 2 3 4 5 6 0.5"


print(letters_and_numbers.isnumeric())
print(letters.isnumeric())
print(numbers.isnumeric())

و دریافت می کنیم:

False
False
True

حالا بیایید نمونه های پیشرفته تری را ببینیم که ممکن است در حین برنامه نویسی در پایتون با آنها مواجه شویم.

نمونه های دستکاری پیشرفته

اکنون می‌خواهیم نشان دهیم که چگونه می‌توانیم از روش‌هایی که در بالا دیدیم برای رهگیری اعداد در رشته‌ها در موقعیت‌های عملی‌تر استفاده کنیم، مثلاً هنگام تجزیه و تحلیل فهرست‌ها، فرهنگ لغت‌ها و فریم‌های داده.

یافتن اعداد در رشته ها در لیست ها

در نظر بگیرید که ما لیستی داریم که در آن تعدادی رشته حاوی اعداد و متن ذخیره کرده ایم. ما می توانیم اعداد را با عبارات منظم مانند زیر استخراج کنیم:

import re


data = ('I have 10 apples', 'There are 5 bananas', 'I will buy one apple')


def extract_numbers(string):
    return re.findall(r'\d+', string)


for string in data:
    numbers = extract_numbers(string)
    print(f"Numbers in string: {string} - {numbers}")

و دریافت می کنیم:

Numbers in string: I have 10 apples - ('10')
Numbers in string: There are 5 bananas - ('5')
Numbers in string: I will buy one apple - ()

بنابراین، در اینجا عدد مربوط به رشته را در صورت وجود گزارش می کنیم. تنها تفاوت بین مثال قبلی روی عبارات منظم عبارتند از:

  1. ما با استفاده از re.findall(). این روش دو آرگومان می گیرد: pattern و string. این همه موارد را جستجو می کند pattern در داخل string و فهرستی از تمام زیررشته های منطبق را برمی گرداند.
  2. در این مورد، pattern توسط \d+، که یک یا چند رقم متوالی در رشته را با استفاده از regex مطابقت می دهد.

بنابراین، ما اعداد و متن را در برخی رشته ها در لیستی به نام ذخیره کرده ایم data. ما یک تابع به نام ایجاد کرده ایم extract_numbers() که تمام ارقام متوالی رشته را از طریق متد قطع می کند re.findall()با تشکر از regex. سپس لیست را با a تکرار می کنیم for loop و تابع را فراخوانی کنید extract_numbers() به طوری که تمام رشته های موجود در لیست بررسی شوند. سپس، کد خود رشته ها و اعداد قطع شده (در صورت وجود) را چاپ می کند.

یافتن اعداد در رشته ها در فرهنگ لغت

حال، فرض کنید ما یک لیست خرید داریم که در یک فرهنگ لغت ذخیره شده است که در آن تعدادی میوه و قیمت مربوط به آنها را گزارش می کنیم. می خواهیم ببینیم که آیا قیمت به صورت یک عدد بیان می شود یا خیر. ما می توانیم این کار را به این صورت انجام دهیم:


def contains_number(string: str) -> bool:
    return any(char.isnumeric() for char in string)


shopping_list = {
 'Banana': '1',
 'Apple': 'Five',
 'Strawberry': '3.5',
 'Pear': '3',
}


for key, value in shopping_list.items():
    if contains_number(value):
         print(f"Value for '{key}' contains a number: {value}")
    else:
         print(f"Value for '{key}' does not contain a number: {value}")

و دریافت می کنیم:

Value for 'Banana' contains a number: 1
Value for 'Apple' does not contain a number: Five
Value for 'Strawberry' contains a number: 3.5
Value for 'Pear' contains a number: 3

بنابراین، ما یک تابع ایجاد کرده ایم contains_number() همانطور که قبلا دیده ایم، اما در اینجا ما از آن استفاده کرده ایم isnumeric() روش (یک اعشار داریم). سپس قیمت برخی از میوه ها را در دیکشنری به نام ذخیره می کنیم shopping_list. با shopping_list.items()، به کلیدها و مقادیر فرهنگ لغت دسترسی پیدا می کنیم و با فراخوانی تابع بررسی می کنیم که آیا مقادیر عددی هستند یا خیر. contains_number(). در نهایت با تشکر از یک if عبارت، می‌توانیم رشته‌های حاوی اعداد را از رشته‌هایی که فقط حاوی متن هستند و print نتایج.

یافتن اعداد در رشته ها در فریم های داده پاندا

در پایتون، می‌توانیم داده‌ها را در فریم‌های داده، که مجموعه‌ای از ستون‌ها و ردیف‌ها هستند (برای سادگی، شبیه به برگه‌های اکسل) ذخیره کنیم. فریم های داده را می توان با کتابخانه ای به نام دستکاری کرد pandas در پایتون

فرض کنید می‌خواهیم ستونی ایجاد کنیم (یک ستون از یک قاب داده را «سری پانداها» می‌نامیم) که در آن قیمت یک شیء را از تأمین‌کنندگان مختلف ذخیره کرده‌ایم. روی آمازون:

import pandas as pd


data = {'Amazon_prices': ('10', '8', '9.2', 'eleven', 'seven')}


df = pd.DataFrame(data)


print(df)

و داریم:

        Amazon_prices
0           10
1            8
2           9.2
3          eleven
4           seven

بنابراین، ما برخی از داده ها را در دیکشنری به نام ذخیره کرده ایم data. سپس، با pd.DataFrame() روش، ما دیکشنری را به یک قاب داده پاندا به نام تبدیل کرده ایم df.

در این مرحله می توانیم از str.contains() روشی از کتابخانه Pandas که برای بررسی الگوها در رشته ها مفید است. می‌توانیم از regex برای تعریف الگوی زیر استفاده کنیم:


numeric_values = df('Amazon_prices').str.contains(r'\d+', regex=True)

با کد بالا، ما در حال بررسی ستون هستیم Amazon_prices به لطف regex شامل اعداد است. با df('Amazon_prices')، ما ستون قاب داده را انتخاب می کنیم. سپس .str.contains() روش بررسی می کند که آیا ما حداقل یک عدد در رشته ها داریم، به لطف regex، همانطور که قبلا دیده شد. در نهایت، regex=True استفاده از regex را فعال می کند.

سپس می‌توانیم یک ستون جدید برای افزودن به قاب داده‌های خود با بولی‌های حاصل مانند زیر ایجاد کنیم:


df('IsNumeric') = numeric_values

بنابراین، IsNumeric ستون جدید قاب داده ما است که حاوی بولی ها است. اکنون می توانیم print چارچوب داده اصلاح شده با print(df) و دریافت می کنیم:

   Amazon_prices  IsNumeric
0           10       True
1            8       True
2           9.2      True
3        eleven     False
4         seven     False

و سپس، ما یک نمای کلی از چارچوب داده داریم.

نتیجه گیری

در این مقاله روش‌های مختلفی برای تعیین وجود اعداد در رشته‌ها در موارد و موقعیت‌های مختلف دیده‌ایم. ما همچنین نشان دادیم که هیچ روشی برای همه وجود ندارد. بسته به روی در شرایط، ما باید یکی را انتخاب کنیم که به بهترین وجه با مشکل خاصی که با آن روبرو هستیم، مطابقت دارد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1402-12-31 06:25:05

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید