الفرق بين المراجعتين لصفحة: «Python/bisect»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:وحدة <code>bisect‎</code> في بايثون}}</noinclude> تقدّم هذه الوحدة وسيلة للتعامل مع القوائم و...'
 
لا ملخص تعديل
 
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:وحدة <code>bisect‎</code> في بايثون}}</noinclude>
<noinclude>{{DISPLAYTITLE:وحدة <code>bisect‎</code> في بايثون}}</noinclude>
تقدّم هذه الوحدة وسيلة للتعامل مع القوائم وفرزها بصورة تلقائية، وبذلك يمكن تجنب إعادة فرز القائمة بعد كل عملية إدراج للعناصر فيها. وتظهر فائدة هذه الوحدة بجلاء عند التعامل مع القوائم الطويلة والتي تؤدي عمليات مقارنة مكثّفة. تحمل هذه الوحدة اسم bisect لأنّها تستخدم خوارزمية التنصيف البسيطة bisection algorithm لإنجاز عملها.
تقدّم هذه الوحدة وسيلة للتعامل مع القوائم وفرزها بصورة تلقائية، وبذلك يمكن تجنب إعادة فرز القائمة بعد كل عملية إدراج للعناصر فيها. وتظهر فائدة هذه الوحدة بجلاء عند التعامل مع القوائم الطويلة والتي تؤدي عمليات مقارنة مكثّفة. تحمل هذه الوحدة اسم <code>bisect</code> لأنّها تستخدم خوارزمية التنصيف البسيطة bisection algorithm لإنجاز عملها.
 
 
== دوال الوحدة <code>bisect</code> ==
== دوال الوحدة <code>bisect</code> ==


تقدّم الوحدة bisect الدوال التالية:
تقدّم الوحدة <code>bisect</code> الدوال التالية:


== الدالة <code>bisect_left()‎</code> ==
=== الدالة <code>[[Python/bisect/bisect left|bisect_left()‎]]</code> ===


تحدّد الدالة موقع إدراج العنصر المحدد في المصفوفة المعطاة.
تحدّد الدالة موقع إدراج العنصر المحدد في المصفوفة المعطاة.


== الدالة <code>bisect_right()‎</code> ==
=== الدالتان <code>[[Python/bisect/bisect right|bisect_right()‎]]</code> و <code>[[Python/bisect/bisect|bisect()‎]]</code> ===
== الدالة <code>bisect_left()‎</code> ==
تعيدان موقع الإدراج الذي يأتي بعد (إلى الجانب الأيمن) العناصر المماثلة للعنصر المضاف في المصفوفة المعطاة.


تعيد موقع الإدراج الذي يأتي بعد (إلى الجانب الأيمن) العناصر المماثلة للعنصر المضاف في المصفوفة المعطاة.
=== الدالة <code>[[Python/bisect/insort left|insort_left()‎]]</code> ===
 
== الدالة <code>insort_left()‎</code> ==
تدرج الدالة العنصر المحدد في المصفوفة المعطاة بترتيب مفروز.
تدرج الدالة العنصر المحدد في المصفوفة المعطاة بترتيب مفروز.


== الدالة <code>insort_right()‎</code> ==
=== الدالتان <code>[[Python/bisect/insort right|insort_right()]]‎</code> و <code>[[Python/bisect/insort|insort()‎]]</code> ===
== الدالة <code>insort()‎</code> ==
تدرجان العنصر المحدّد في المصفوفة المعطاة بعد العناصر المماثلة للعنصر المعطى والموجودة أصلًا في المصفوفة.
 
تدرج العنصر المحدّد في المصفوفة المعطاة بعد العناصر المماثلة للعنصر x والموجودة أصلًا في المصفوفة.


== البحث في القوائم المفروزة ==
== البحث في القوائم المفروزة ==


يمكن الاستفادة من دوال bisect()‎ بمختلف أنواعها للعثور على مواقع الإدراج، ولكن يمكن أن تكون صعبة الاستخدام عند إجراء عمليات البحث الشائعة.  
يمكن الاستفادة من دوال <code>bisect()</code>‎ بمختلف أنواعها للعثور على مواقع الإدراج، ولكن يمكن أن تكون صعبة الاستخدام عند إجراء عمليات البحث الشائعة.  


تبيّن الشيفرة التالية طريقة تحويل خمس دوال لإيجاد موقع الإدراج إلى دوال للبحث في القوائم المفروزة:
تبيّن الشيفرة التالية طريقة تحويل خمس دوال لإيجاد موقع الإدراج إلى دوال للبحث في القوائم المفروزة:
سطر 76: سطر 70:
== أمثلة ==
== أمثلة ==


يمكن الاستفادة من دالة bisect()‎ لإجراء عمليات البحث في الجداول الرقمية numeric table. يستخدم المثال التالي الدالة bisect()‎ للعثور على الدرجة الحرفية المقابلة لدرجة امتحان على سبيل المثال وذلك باستخدام مجموعة من النقاط الثابتة والمرتبة: 90 فما فوق تمثّل درجة 'A'، و 80 إلى 89 تمثّل درجة 'B'، وهكذا.
يمكن الاستفادة من دالة <code>bisect()</code>‎ لإجراء عمليات البحث في الجداول الرقمية numeric table. يستخدم المثال التالي الدالة <code>bisect()</code>‎ للعثور على الدرجة الحرفية المقابلة لدرجة امتحان على سبيل المثال وذلك باستخدام مجموعة من النقاط الثابتة والمرتبة: <code>90</code> فما فوق تمثّل درجة <code>'A'</code>، و <code>80</code> إلى <code>89</code> تمثّل درجة <code>'B'</code>، وهكذا.


<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
سطر 89: سطر 83:
</syntaxhighlight>
</syntaxhighlight>


بخلاف الدالة sorted()‎ فإنّه ليس من المنطقي أن تمتلك دوال bisect()‎ معاملات مثل key أو reversed لأنّ ذلك سيجعل الدالة تعمل بصورة غير فعّالة (فالاستدعاءات المتعاقبة لدوال bisect لن تتذكر جميع المفاتيح السابقة).
بخلاف الدالة [[Python/sorted|<code>sorted()</code>]] فإنّه ليس من المنطقي أن تمتلك دوال <code>bisect()</code>‎ معاملات مثل <code>key</code> أو <code>reversed</code> لأنّ ذلك سيجعل الدالة تعمل بصورة غير فعّالة (فالاستدعاءات المتعاقبة لدوال <code>bisect</code> لن تتذكر جميع المفاتيح السابقة).


لذا فمن الأفضل -عوضًا عما سبق- البحث في قائمة من مفاتيح معدّة مسبقًا للعثور على موقع العنصر المطلوب:
لهذا يفضّل -عوضًا عما سبق- البحث في قائمة من مفاتيح معدّة مسبقًا للعثور على موقع العنصر المطلوب:


<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
سطر 108: سطر 102:


</syntaxhighlight>
</syntaxhighlight>
== انظر أيضًا ==
== مصادر ==
== مصادر ==
[https://docs.python.org/3/library/bisect.html صفحة Array bisection algorithm في توثيق بايثون الرسمي.]
* [https://docs.python.org/3/library/bisect.html صفحة Array bisection algorithm في توثيق بايثون الرسمي.]
 
 
[[تصنيف:Python]]
[[تصنيف:Python]]
[[تصنيف:Python Modules]]
[[تصنيف:Python Modules]]

المراجعة الحالية بتاريخ 19:45، 5 أغسطس 2018

تقدّم هذه الوحدة وسيلة للتعامل مع القوائم وفرزها بصورة تلقائية، وبذلك يمكن تجنب إعادة فرز القائمة بعد كل عملية إدراج للعناصر فيها. وتظهر فائدة هذه الوحدة بجلاء عند التعامل مع القوائم الطويلة والتي تؤدي عمليات مقارنة مكثّفة. تحمل هذه الوحدة اسم bisect لأنّها تستخدم خوارزمية التنصيف البسيطة bisection algorithm لإنجاز عملها.

دوال الوحدة bisect

تقدّم الوحدة bisect الدوال التالية:

الدالة bisect_left()‎

تحدّد الدالة موقع إدراج العنصر المحدد في المصفوفة المعطاة.

الدالتان bisect_right()‎ و bisect()‎

تعيدان موقع الإدراج الذي يأتي بعد (إلى الجانب الأيمن) العناصر المماثلة للعنصر المضاف في المصفوفة المعطاة.

الدالة insort_left()‎

تدرج الدالة العنصر المحدد في المصفوفة المعطاة بترتيب مفروز.

الدالتان insort_right() و insort()‎

تدرجان العنصر المحدّد في المصفوفة المعطاة بعد العناصر المماثلة للعنصر المعطى والموجودة أصلًا في المصفوفة.

البحث في القوائم المفروزة

يمكن الاستفادة من دوال bisect()‎ بمختلف أنواعها للعثور على مواقع الإدراج، ولكن يمكن أن تكون صعبة الاستخدام عند إجراء عمليات البحث الشائعة.

تبيّن الشيفرة التالية طريقة تحويل خمس دوال لإيجاد موقع الإدراج إلى دوال للبحث في القوائم المفروزة:

# تحديد موقع العنصر في أقصى اليسار والمساوي بالضبط للعنصر x
def index(a, x):
    'Locate the leftmost value exactly equal to x'
    i = bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError

# العثور على القيمة في أقصى اليمين والتي تكون أصغر من x
def find_lt(a, x):
    'Find rightmost value less than x'
    i = bisect_left(a, x)
    if i:
        return a[i-1]
    raise ValueError

# العثور على القيمة في أقصى اليمين والتي تكون أصغر من أو تساوي x
def find_le(a, x):
    'Find rightmost value less than or equal to x'
    i = bisect_right(a, x)
    if i:
        return a[i-1]
    raise ValueError

# العثور على القيمة في أقصى اليسار والتي تكون أكبر من x
def find_gt(a, x):
    'Find leftmost value greater than x'
    i = bisect_right(a, x)
    if i != len(a):
        return a[i]
    raise ValueError

# العثور على العنصر في أقصى اليسار والذي يكون أكبر من أو يساوي x
def find_ge(a, x):
    'Find leftmost item greater than or equal to x'
    i = bisect_left(a, x)
    if i != len(a):
        return a[i]
    raise ValueError

أمثلة

يمكن الاستفادة من دالة bisect()‎ لإجراء عمليات البحث في الجداول الرقمية numeric table. يستخدم المثال التالي الدالة bisect()‎ للعثور على الدرجة الحرفية المقابلة لدرجة امتحان على سبيل المثال وذلك باستخدام مجموعة من النقاط الثابتة والمرتبة: 90 فما فوق تمثّل درجة 'A'، و 80 إلى 89 تمثّل درجة 'B'، وهكذا.

>>> def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
...     i = bisect(breakpoints, score)
...     return grades[i]
...
>>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']

بخلاف الدالة sorted() فإنّه ليس من المنطقي أن تمتلك دوال bisect()‎ معاملات مثل key أو reversed لأنّ ذلك سيجعل الدالة تعمل بصورة غير فعّالة (فالاستدعاءات المتعاقبة لدوال bisect لن تتذكر جميع المفاتيح السابقة).

لهذا يفضّل -عوضًا عما سبق- البحث في قائمة من مفاتيح معدّة مسبقًا للعثور على موقع العنصر المطلوب:

>>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
>>> data.sort(key=lambda r: r[1])
>>> keys = [r[1] for r in data]         # قائمة من المفاتيح المعدّة مسبقًا
>>> data[bisect_left(keys, 0)]
('black', 0)
>>> data[bisect_left(keys, 1)]
('blue', 1)
>>> data[bisect_left(keys, 5)]
('red', 5)
>>> data[bisect_left(keys, 8)]
('yellow', 8)

مصادر