مقدمة
أ قائمة تعتبر واحدة من هياكل البيانات الأكثر مرونة في لغة برمجة بايثون. من ناحية أخرى، القائمة ثنائية الأبعاد، أو القائمة ثنائية الأبعاد، والتي يطلق عليها عمومًا قائمة القوائم، هي كائن من القائمة حيث يكون كل عنصر عبارة عن قائمة بحد ذاتها. على سبيل المثال: [[19، 18، 17]، [16، 15، 14]، [13، 12، 11]].
تسوية قائمة القوائم هي عملية تحويل قائمة ثنائية الأبعاد إلى قائمة أحادية البعد عن طريق إلغاء تداخل كل عنصر قائمة محفوظ في قائمة القوائم، أي تحويل [[9، 8، 7]، [6] ، 5، 4]، [3، 2، 1]] إلى [9، 8، 7، 6، 5، 4، 3، 2، 1].
يمكننا إجراء عملية التسطيح بمساعدة المتداخلة ل الحلقات، أو العودية، أو فهم القائمة، أو الوظائف الأساسية، أو استيراد المكتبات أو الحزم في بايثون على عمق وانتظام القوائم المتداخلة.
في هذا البرنامج التعليمي، سنعمل على طرق مختلفة لتسوية القوائم المتداخلة باستخدام لغة برمجة بايثون. ولكن قبل أن نبدأ، دعونا نفهم أنواع القوائم المتداخلة.
ما هي أنواع القوائم المتداخلة؟
كما نعرف، بايثون هي لغة برمجة ضعيفة الكتابة. ولذلك، يمكننا أن نواجه نوعين من قائمة القوائم. قائمة القوائم أو القوائم المتداخلة هذه هي كما يلي:
- قائمة القوائم العادية
- قائمة غير منتظمة من القوائم
قائمة القوائم العادية
ويشار إلى كل عنصر في القائمة العادية للقوائم على أنه قائمة فرعية، وبالتالي يتم ملاحظة توحيد نوع العنصر. على سبيل المثال: [[9، 8، 7]، [6، 5، 4]، [3، 2، 1]] هي قائمة عادية من القوائم مثل [9، 8، 7]، [6، 5، 4] ، [3، 2، 1] من نوع القائمة.
قائمة غير منتظمة من القوائم
رقم ارمسترونج
تتم الإشارة إلى كل عنصر في القائمة غير النظامية للقوائم إما على أنه قائمة فرعية أو عنصر غير قائمة (على سبيل المثال، سلسلة أو عدد صحيح). وبالتالي هناك عدم انتظام من حيث نوع العنصر. على سبيل المثال: [[9، 8، 7]، [6، 5]، 4، 3] هي قائمة غير منتظمة من القوائم حيث أن [9، 8، 7] و [6، 5] هي من أنواع القوائم، في حين أن 4 و3 من النوع int.
تسوية قائمة القوائم باستخدام الحلقات المتداخلة
تسطيح قائمة القوائم مع المتداخلة ل تعتبر مساعدة الحلقات بمثابة أسلوب القوة الغاشمة للحصول على قائمة مسطحة. يمكننا تنفيذ هذه الطريقة عن طريق اختيار كل عنصر من القائمة ثنائية الأبعاد وترتيبه في قائمة أحادية البعد.
دعونا نفكر في المثال التالي الذي يصلح لكل من قوائم القوائم العادية وغير المنتظمة.
مثال:
# defining the function def flattenlist(_2dlist): # defining an empty list flatlist = [] # Iterating through the outer list for item in _2dlist: if type(item) is list: # If the item is of the list type, iterating through the sub-list for element in item: flatlist.append(element) else: flatlist.append(item) return flatlist # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] print('Genuine List:', nestedlist) print('Converted Flat List:', flattenlist(nestedlist))
انتاج:
Genuine List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] Converted Flat List: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
توضيح:
في المثال أعلاه، قمنا بتعريف وظيفة كما com.flattenlist الذي يأخذ في المعلمة كما _2dlist . لقد استخدمنا بعد ذلك ل حلقة لتكرار عناصر القائمة المتداخلة وإلحاقها لإنشاء قائمة مسطحة. لقد قمنا بعد ذلك بتحديد القائمة المتداخلة وتنفيذها com.flattenlist وظيفة. ونتيجة لذلك، تم تحويل القائمة المتداخلة بنجاح إلى القائمة المسطحة.
تسوية القائمة المتداخلة باستخدام فهم القائمة
تعتبر تسوية قائمة القوائم بمساعدة فهم القائمة أسلوبًا أنيقًا للحصول على قائمة مسطحة اعتمادًا على قائمة موجودة ثنائية الأبعاد. ومع ذلك، فإن هذا النهج يقدم حلاً أقل بديهية.
دعونا نتأمل المثال التالي.
مثال:
# defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # list comprehension flatlist = [element for sub_list in nestedlist for element in sub_list] print('Genuine list:', nestedlist) print('Converted list:', flatlist)
انتاج:
Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
توضيح:
في المثال أعلاه، قمنا بتحديد قائمة متداخلة وفهم القائمة. ثم قمنا بطباعتها للمستخدمين. ونتيجة لذلك، تم تحويل القائمة المتداخلة إلى القائمة المسطحة بنجاح.
تسطيح قائمة القوائم باستخدام الطريقة العودية
يمكننا أيضًا استخدام الطريقة العودية لتسوية القائمة ثنائية الأبعاد. دعونا نفكر في المثال التالي لتطبيق الطريقة العودية من أجل تسطيح قائمة القوائم. يعمل هذا التنفيذ بشكل جيد مع قائمة القوائم العادية وغير المنتظمة.
مثال:
# defining a function def flattenlist(nestedlist): if len(nestedlist) == 0: return nestedlist if isinstance(nestedlist[0], list): return flattenlist(nestedlist[0]) + flattenlist(nestedlist[1:]) return nestedlist[:1] + flattenlist(nestedlist[1:]) print(flattenlist([[10, 20, 30, 40], [50, 60, 70], [80, 90], 100]))
انتاج:
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
توضيح:
في المثال أعلاه، قمنا بتعريف دالة واستخدمنا لو إفادة يوضح ما إذا كان طول القائمة المتداخلة يساوي صفرًا، ثم يُرجع القائمة المتداخلة.
مجموعات في جافا
إذا كان عنصر البيانات الموجود في الفهرس الصفري عبارة عن مثيل لقائمة، فسينتقل فهرس القائمة إلى الوظيفة مرة أخرى ويضيف إلى الفهرس التالي للقائمة وما إلى ذلك. وإلا فإن الوظيفة ستعيد العناصر وما إلى ذلك. أخيرًا، حددنا القائمة المتداخلة وقمنا بتنفيذ الوظيفة. ونتيجة لذلك، تم تسوية قائمة القوائم بشكل متكرر.
الاستفادة من مكتبات بايثون
يمكننا أيضًا الاستفادة من بعض مكتبات لغة البرمجة Python لتسوية قائمة القوائم. يتم وصف تنفيذ هذه المكتبات أدناه:
تسوية قائمة القوائم باستخدام الأدوات الوظيفية ومكتبات المشغلين
ال المشغل أو العامل توفر المكتبة أيقونة القط () وظيفة لأداء العملية الأساسية مثل التسلسل. يمكننا تطبيق هذه الوظيفة بشكل تراكمي على عناصر البيانات في القائمة المتداخلة، من اليسار إلى اليمين، مما يؤدي إلى تقليل القائمة المتداخلة إلى قائمة مسطحة.
دعونا نفكر في المثال التالي لفهم كيفية تنفيذه.
مثال:
# importing the required libraries import operator import functools regularlist = [] # Converting the list of lists into a flattened one. def convo(nestedlist): for element in nestedlist: if type(element) is list: regularlist.append(element) else: regularlist.append([element]) return regularlist twoDlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] regular2Dlist = convo(twoDlist) print('Given List:', twoDlist) print('Converted list:', functools.reduce(operator.iconcat, regular2Dlist, []))
انتاج:
Given List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]
توضيح:
في المثال أعلاه، قمنا باستيراد ملف functools المكتبة جنبا إلى جنب مع المشغل أو العامل مكتبة. لقد قمنا بعد ذلك بتحديد قائمة فارغة باسم القائمة المنتظمة . لقد قمنا بعد ذلك بتعريف الوظيفة على أنها قافلة لتحويل قائمة القوائم إلى قائمة مسطحة. في هذه الدالة استخدمنا ل حلقة حيث يتم إلحاق العناصر من القائمة المتداخلة بالقائمة الفارغة التي حددناها سابقًا. لاحقًا قمنا بتحديد القائمة المتداخلة وتنفيذ الوظيفة. ونتيجة لذلك، يتم تحويل قائمة القوائم إلى قائمة مسطحة بنجاح.
تسطيح قائمة القوائم باستخدام مكتبة itertools
ال com.itertools توفر المكتبة سلسلة() وظيفة تسمح لنا بتحويل قائمة متداخلة إلى قائمة مسطحة واحدة بشكل مثالي. تتعامل هذه الوظيفة مع السلاسل المتتالية كسلسلة واحدة عن طريق تكرارها عبر التكرار الذي تم تمريره كمعلمة بطريقة تسلسلية.
دعونا نتأمل المثال التالي:
مثال:
# importing the itertools library import itertools # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] flattenlist = list(itertools.chain(*nestedlist)) print('The nested list:', nestedlist) print('The flattened list:', flattenlist
انتاج:
The nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] The flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
توضيح:
في المثال أعلاه، قمنا باستيراد ملف com.itertools المكتبة وإنشاء قائمة متداخلة. لقد استخدمنا بعد ذلك سلسلة() دالة لتحويل القائمة المتداخلة المحددة إلى القائمة المسطحة. وأخيرًا، قمنا بإرجاع النتيجة إلى المستخدمين. ونتيجة لذلك، يتم تسوية قائمة القوائم بنجاح.
تسوية قائمة القوائم باستخدام مكتبة NumPy
ال NumPy توفر المكتبة العديد من العمليات اليومية، بما في ذلك تسلسل المصفوفات العادية ثنائية الأبعاد على مستوى الأعمدة أو الصفوف. سوف نستخدم السمة المعروفة باسم مستوي من أجل الحصول على مكرر أحادي البعد فوق المصفوفة للتغلب على الهدف. دعونا نفكر في المثال التالي لفهم استخدام الدالة التسلسلية والسمة المسطحة.
مثال:
إذا كان آخر جافا
# importing the library import numpy # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the concatenate function along with the flat attribute flattenlist = list(numpy.concatenate(nestedlist).flat) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist)
انتاج:
The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
توضيح:
في المثال أعلاه، قمنا باستيراد ملف numpy المكتبة وحدد قائمة متداخلة. لقد استخدمنا بعد ذلك سلسل وظيفة numpy المكتبة معها مستوي سمة لتسوية عناصر القائمة المتداخلة وتسلسلها إلى قائمة مسطحة جديدة. أخيرًا، قمنا بطباعة النتيجة للمستخدمين. وهكذا، تم تسوية قائمة القوائم بنجاح.
الاستفادة من الوظائف الأساسية
يمكننا أيضًا تنفيذ مهمة التسوية من خلال استخدام بعض الوظائف الأساسية التي توفرها لغة برمجة بايثون.
تسوية قائمة القوائم باستخدام دالة المجموع
يمكننا أن نفكر في جمع القوائم الداخلية كحل آخر للمشكلة. نمرر حجتين إلى مجموع الوظيفة: المعلمة الأولى هي متوقعة ، وهي قائمة متداخلة، والمعلمة الثانية هي يبدأ وهي قائمة فارغة للحالة التالية والتي تعمل كقائمة مسطحة أولية حيث سيتم إضافة عناصر البيانات للقوائم الفرعية الداخلية.
يمكننا القول أن هذا الأسلوب مناسب جدًا لأننا لا نحتاج إلى استيراد أي شيء. ومع ذلك، فهو أبطأ من أدوات itertools() و سلسلة() تعمل عندما يكون هناك عدد كبير من القوائم الفرعية الموجودة في القائمة المتداخلة.
دعونا نتأمل المثال التالي:
دي دي إل مقابل دي إم إل
مثال:
# defining a nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the sum function flattenlist = sum(nestedlist, []) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist)
انتاج:
The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]
توضيح:
في المثال أعلاه، قمنا بتعريف القائمة المتداخلة. لقد استخدمنا بعد ذلك مجموع() وظيفة وتسوية القائمة المتداخلة في قائمة أحادية البعد، وطباعة القائمة الناتجة للمستخدمين. ونتيجة لذلك، قمنا بتحويل قائمة القوائم إلى قائمة مسطحة بنجاح.
تسوية قائمة القوائم باستخدام الكلمة الأساسية Lambda
يمكننا تحديد وظيفة مجهولة باستخدام الكلمة الأساسية لامدا . يمكننا تمرير القائمة العادية/غير المنتظمة كمعلمة لهذه الوظيفة المجهولة. يتم تقييم التعبير من أجل الحصول على قائمة مسطحة أحادية البعد.
دعونا نتأمل المثال التالي:
مثال:
# Defining the nested list nestedlist = [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] # Using lambda parameters: expression flattenlist = lambda nestedlist:[item for element in nestedlist for item in flattenlist(element)] if type(nestedlist) is list else [nestedlist] print('The Nested list:', nestedlist) print('The Flattened List:', flattenlist(nestedlist))
انتاج:
The Nested list: [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] The Flattened List: [10, 20, 30, 30, 50, 60, 40, 60, 70, 70]
توضيح:
في المثال أعلاه، قمنا بتحديد قائمة متداخلة. لقد استخدمنا بعد ذلك لامدا الكلمة الأساسية مع وسيطة تحدد تعبيرًا لفهم القائمة. ثم قمنا بطباعتها للمستخدمين. ونتيجة لذلك، نجحنا في تحويل القائمة غير النظامية ثنائية الأبعاد إلى القائمة المسطحة.