11.7. أدوات للعمل مع القوائم #
يمكن تلبية العديد من احتياجات هياكل البيانات باستخدام نوع القائمة المُدمجة. ومع ذلك، قد تظهر أحيانًا الحاجة إلى تطبيقات بديلة ذات تنازلات مختلفة في الأداء.
توفر وحدة المصفوفة كائن array() يشبه القائمة، حيث يخزن البيانات المتجانسة فقط، ويخزنها بشكل أكثر إحكامًا. يوضح المثال التالي مصفوفة أرقام مخزنة كأرقام ثنائية غير موقعة ثنائية البايت (رمز النوع “H”) بدلاً من 16 بايتًا لكل مُدخلة كما هو مُعتاد في قوائم كائنات بايثون int العادية:
>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])
توفر وحدة المجموعات كائن deque() يشبه القائمة، مع عمليات إضافة وإخراج أسرع من الجانب الأيسر، وعمليات بحث أبطأ في المنتصف. هذه الكائنات مناسبة تمامًا لتنفيذ طوابير البحث وعمليات البحث الشجرية ذات العرض الأول:
>>> from collections import deque
>>> d = deque(["task1", "task2", "task3"])
>>> d.append("task4")
>>> print("Handling", d.popleft())
Handling task1
unsearched = deque([starting_node])
def breadth_first_search(unsearched):
node = unsearched.popleft()
for m in gen_moves(node):
if is_goal(m):
return m
unsearched.append(m)
بالإضافة إلى تطبيقات القوائم البديلة، توفر المكتبة أيضًا أدوات أخرى مثل وحدة bisect مع دوال للتعامل مع القوائم المرتبة:
>>> import bisect
>>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
>>> bisect.insort(scores, (300, 'ruby'))
>>> scores
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
توفر وحدة heapq دوالاً لتنفيذ الكومات بناءً على قوائم منتظمة. يُحفظ دائمًا المُدخل ذو القيمة الأقل في الموضع صفر. هذا مفيد للتطبيقات التي تصل بشكل متكرر إلى أصغر عنصر ولكنها لا تريد إجراء فرز كامل للقائمة:
>>> from heapq import heapify, heappop, heappush
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> heapify(data) # rearrange the list into heap order
>>> heappush(data, -5) # add a new entry
>>> [heappop(data) for i in range(3)] # fetch the three smallest entries
[-5, 0, 1]