مقتطفات من بايثون تحتاج الى معرفتها - Python Snippets

hocine
Hocine G
Back-end Developer (Python/Django)
18/07/2022 |برمجة 💻
مقتطفات من بايثون تحتاج الى معرفتها - Python Snippets

بعض مقتطفات من لغة البرمجة بايثون التي تحتاج الى معرفتها

عندما تستخدم بايثون يوميًا لحل التحديات وتطوير الخوارزميات وإنشاء التطبيقات، ستجد نفسك تكرر بعض المهام مرارًا وتكرارًا. وهذا هو السبب في أنه من الجيد أن يكون لديك بعض مقتطفات و اكواد جاهزة للمهام التي يتم إجراؤها بشكل متكرر.

 

قائمة المقتطفات

  1. دمج قائمتين (List) في قاموس (Dictionary)
  2. دمج قائمتين أو أكثر في قائمة قوائم
  3. ترتيب قائمة قواميس (List of Dictionaries)
  4. ترتيب قائمة سلاسل Strings
  5. فرز قائمة على بناءََ على قائمة أخرى
  6. دمج قاموسين أو أكثر
  7. عكس قاموس Inverting a Dictionary
  8. استخدام سلاسل F (f strings)
  9. التحقق من السلاسل الفرعية Substrings
  10. الحصول على حجم سلسلة بالبايت
  11. التحقق من وجود ملف
  12. تحليل جدول بيانات

 

القوائم List

سنبدأ ببعض المقتطفات حول بنية البيانات الأكثر استخدامًا في بايثون و هي List.

 

دمج قائمتين (List) في قاموس (Dictionary)

لنفترض أن لدينا قائمتين (List)  في بايثون ونريد دمجهما في نموذج قاموس (Dictionary)، حيث تعمل عناصر القائمة كمفاتيح Keys القاموس والأخرى كقيم Values. هذه مشكلة متكررة غالبًا ما يتم مواجهتها عند كتابة تعليمات برمجية بلغة بايثون.

لحل هذه المشكلة ، نحتاج إلى مراعاة بعض القيود مثل:حجم القائمتين وأنواع و تكرار العناصر فيها، خاصة في القائمة التي ستسخدم كمفاتيح Keys. يمكننا التغلب على ذلك باستخدام وظائف مضمنة مثل zip.

keys_list = ['A', 'B', 'C']
values_list = ['blue', 'red', 'bold']

# هناك 3 طرق للوصول اللى دمج قائمتين في قاموس

# الطريقة الاولى باستعمال zip و dict
dict_method_1 = dict(zip(keys_list, values_list))

# الطريقة الثانية
dict_method_2 = {key:value for key, value in zip(keys_list, values_list)}

# الطريقة الثالثة باستعمال zip مع الحلقات
items_tuples = zip(keys_list, values_list) 
dict_method_3 = {} 
for key, value in items_tuples: 
    if key in dict_method_3: 
        pass # To avoid repeating keys.
    else: 
        dict_method_3[key] = value

 

دمج قائمتين أو أكثر في قائمة قوائم

مهمة أخرى متكررة هي عندما يكون لدينا قائمتان أو أكثر، ونريد جمعها جميعًا في قائمة واحدة كبيرة من القوائم.

على سبيل المثال، إذا كان لدينا 4 قوائم:

[1, 2, 3]
['a', 'b', 'c']
[4, 5, 6]

ونريد عمل قائمة جديدة بهذه القوائم الأربع و التي ستكون كالتالي:

[[1، 'a'، 'h'، 4]، [2، 'b'، 'e'، 5]، [3، 'c'، 'y'، 6]]

 

def merge(*args, missing_val = None):
# يستخدم كتغير missing_val  في حالة ان هناك قائمة اقصر من قائمة اخرى
  max_length = max([len(lst) for lst in args])
  outList = []
  for i in range(max_length):
    outList.append([args[k][i] if i < len(args[k]) else missing_val for k in range(len(args))])
  return outList

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = [4, 5, 6]
f = [1]

print(merge(a, b, c)
# [[1, 'a', 4], [2, 'b', 5], [3, 'c', 6]]

print(merge(a, b, f)
# [[1, 'a', 1], [2, 'b', None], [3, 'c', None]]

 

ترتيب قائمة قواميس (List of Dictionaries)

سوف نقوم بترتيب قائمة تحتوي على قواميس بالطريقة التالة:

dicts_lists = [
  {
    "Name": "James",
    "Age": 20,
  },
  {
     "Name": "May",
     "Age": 14,
  },
  {
    "Name": "Katy",
    "Age": 23,
  }
]

# هناك عدة طرق منها
dicts_lists.sort(key=lambda item: item.get("Age"))

# طريقة اخرى باستعمال itemgetter مبنية على الاسم (name)
from operator import itemgetter
f = itemgetter('Name')
dicts_lists.sort(key=f)

 

ترتيب قائمة سلاسل Strings

غالبًا ما نواجه قوائم تحتوي على سلاسل، ونحتاج إلى ترتيب او فرز هذه القوائم أبجديًا أو حسب الطول أو أي عامل آخر نريده (أو ما يحتاجه تطبيقنا).

هذه طرق مباشرة لفرز قائمة السلاسل، ولكن قد تحتاج أحيانًا إلى تنفيذ خوارزمية الفرز لحل هذه المشكلة.

my_list = ["b", "c", "a"]

# فرز أبجديًا أو تصاعديًا للبيانات الرقمية
my_list.sort() # ['a', 'b', 'c']

my_list = ["bb", "ccc", "aa"]

# فرز القائمة بناءً على طول السلاسل من الأقصر إلى الأطول.
my_list = sorted(my_list, key=len) # ['bb', 'aa', 'ccc']

 

فرز قائمة على بناءََ على قائمة أخرى

في بعض الأحيان، قد نرغب أو نحتاج إلى استخدام قائمة واحدة لفرز قائمة أخرى. لذلك سيكون لدينا قائمة بالأرقام (الفهارس) وقائمة نرغب في فرزها باستخدام هذه الفهارس.

a = ['blue', 'green', 'orange', 'purple', 'yellow']
b = [3, 2, 5, 4, 1]
#Use list comprehensions to sort these lists
sortedList =  [val for (_, val) in sorted(zip(b, a), key=lambda x: x[0])]

 

القواميس Dictionary

نوع البيانات التالي الذي سنتناوله هو القواميس.

 

دمج قاموسين أو أكثر

لنفترض أن لدينا قاموسين أو أكثر، ونريد دمجهم جميعًا في قاموس واحد بمفاتيح فريدة Keys:

from collections import defaultdict

# دمج اثنين أو أكثر من القواميس باستخدام collections 

def merge_dicts(*dicts):
  mdict = defaultdict(list)
  for d in dicts:
    for key in d:
      mdict[key].append(d[key])
  return dict(mdict)

 

عكس قاموس Inverting a Dictionary

تتمثل إحدى مهام الشائعة في قلب مفاتيح القاموس وقيمه. لذلك، ستصبح المفاتيح هي القيم، وستصبح القيم هي المفاتيح.

عندما نفعل ذلك، نحتاج إلى التأكد من عدم وجود مفاتيح مكررة. بينما يمكن تكرار القيم لا يمكن للمفاتيح التكرار. و ايضا التأكد من أن جميع المفاتيح الجديدة قابلة للتجزئة (hashable).

my_dict = {
  "brand": "Ford",
  "model": "Mustang",
  "year": 1964
}
# قلب القاموس حسب محتواه
# 1- إذا علمنا أن جميع القيم فريدة.
my_inverted_dict = dict(map(reversed, my_dict.items()))

# 2- في حالة وجود قيم غير فريدة
from collections import defaultdict
my_inverted_dict = defaultdict(list)
{my_inverted_dict[v].append(k) for k, v in my_dict.items()}

# 3- إذا كانت أي من القيم غير قابلة للتجزئة
my_dict = {value: key for key in my_inverted_dict for value in my_inverted_dict[key]}

 

السلاسل Strings

سنتناول مقتطفات من السلاسل.

 

استخدام سلاسل F (f strings)

ربما يكون تنسيق سلسلة هي المهمة الأولى التي سنحتاج إلى القيام بها يوميًا تقريبًا. هناك طرق مختلفة يمكننا من خلالها تنسيق السلاسل في بايثون منها سلاسل f.

# تنسيق السلاسل مع سلسلة f.
str_val = 'books'
num_val = 15
print(f'{num_val} {str_val}') # 15 books
print(f'{num_val % 2}') # 1
print(f'{str_val!r}') # books

# التعامل مع الاعداد بالفاصلة
price_val = 5.18362
print(f'{price_val:.2f}') # 5.18

# تنسيق التواريخ
from datetime import datetime;
date_val = datetime.utcnow()
print(f'{date_val=:%Y-%m-%d}') # date_val=2022-07-18

 

التحقق من السلاسل الفرعية Substrings

واحدة من أكثر المهام شيوعًا هي التحقق مما إذا كانت السلسلة موجودة في قائمة السلاسل.

addresses = ["123 Elm Street", "531 Oak Street", "678 Maple Street"]
street = "Elm Street"

# 1- باستخدام find()
for address in addresses:
    if address.find(street) >= 0:
        print(address)

# 2- استخدام الكلمة "in"
for address in addresses:
    if street in address:
        print(address)

 

الحصول على حجم سلسلة بالبايت

في بعض الأحيان، خاصةً عند إنشاء تطبيقات تلعب فيها الذاكرة دورا حساس، نحتاج إلى معرفة مقدار الذاكرة التي تستخدمها سلاسلنا. لحسن الحظ، يمكننا القيام بذلك بسرعة باستخدام سطر واحد من التعليمات البرمجية.

str1 = "hello"
str2 = "😀"

def str_size(s):
  return len(s.encode('utf-8'))

str_size(str1)
str_size(str2)

 

عمليات الإدخال / الإخراج I/O

سنتناول مقتطفات حول عمليات التي تخص المدخلات و المخرجات.

 

التحقق من وجود ملف

غالبًا ما نحتاج إلى قراءة أو كتابة البيانات من الملفات. للقيام بذلك نحتاج إلى التحقق مما إذا كان الملف موجودًا حتى لا نواجه خطأ.

# 1- استخدام وحدة نظام التشغيل OS
import os 
exists = os.path.isfile('/path/to/file')

# 2- استخدم وحدة pathlib للحصول على أداء أفضل
from pathlib import Path
config = Path('/path/to/file') 
if config.is_file(): 
    pass

 

تحليل جدول بيانات

التفاعل مع الملفات و تحليل البيانات من جدول بيانات امر شائع. لحسن الحظ لدينا وحدة CSV لمساعدتنا في أداء هذه المهمة بكفاءة.

import csv
csv_mapping_list = []
with open("/path/to/data.csv") as my_data:
    csv_reader = csv.reader(my_data, delimiter=",")
    line_count = 0
    for line in csv_reader:
        if line_count == 0:
            header = line
        else:
            row_dict = {key: value for key, value in zip(header, line)}
            csv_mapping_list.append(row_dict)
        line_count += 1

 

 

هذه المقتطفات بسيطة وقصيرة وفعالة. سينتهي بك الأمر باستخدام واحد منهم على الأقل في أي مشروع بايثون ان شاء الله, بغض النظر عن مجال التطبيق الذي تعمل فيه.

نتمنى ان الموضوع اعجبك, لا تتردد في ترك مقتطف اخر او اضافة في التعليقات.

تذكر أن المساهمات في هذا الموضوع يجب أن تتبع إرشادات المجتمع.


التعليقات:

    لا توجد تعليقات بعد.