Python Programming

إتقان تسطيح القوائم في بايثون: تقنيات ضحلة وعميقة

Spread the love

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

محتويات

التسطيح السطحي

يزيل التسطيح السطحي مستوى واحد فقط من التداخل. وهو مثالي عندما يكون لديك قائمة قوائم، ولكن هذه القوائم الداخلية لا تحتوي على هياكل متداخلة أخرى. توجد طريقتان فعالتان:

التعبير القائم على القائمة: يوفر هذا حلاً مختصراً وسهل القراءة:


nested_list = [[1, 2, 3], [4, 5], [6]]
flat_list = [item for sublist in nested_list for item in sublist]
print(flat_list)  # الإخراج: [1, 2, 3, 4, 5, 6]

itertools.chain.from_iterable: بالنسبة للقوائم الأكبر حجمًا، يوفر هذا النهج أداءً أفضل نظرًا لتكراره المُحسّن:


from itertools import chain

nested_list = [[1, 2, 3], [4, 5], [6]]
flat_list = list(chain.from_iterable(nested_list))
print(flat_list)  # الإخراج: [1, 2, 3, 4, 5, 6]

القيود: يفشل التسطيح السطحي في تسطيح القوائم بشكل كامل التي تحتوي على قوائم متداخلة داخل قوائم متداخلة. على سبيل المثال:


nested_list = [[1, 2, [3, 4]], [5, 6]]
flat_list = [item for sublist in nested_list for item in sublist]
print(flat_list)  # الإخراج: [1, 2, [3, 4], 5, 6]

تبقى القائمة الداخلية [3, 4] متداخلة.

التسطيح العميق

يتعامل التسطيح العميق بشكل متكرر مع القوائم المتداخلة من أي عمق. توجد طريقتان أساسيتان:

الدالة التراجعية: هذا الحل الأنيق يستخدم التراجع لتجول في الهيكل المتداخل:


def flatten(nested_list):
    flat_list = []
    for item in nested_list:
        if isinstance(item, list):
            flat_list.extend(flatten(item))
        else:
            flat_list.append(item)
    return flat_list

nested_list = [[1, 2, [3, 4]], [5, 6, [7, [8, 9]]]]
flat_list = flatten(nested_list)
print(flat_list)  # الإخراج: [1, 2, 3, 4, 5, 6, 7, 8, 9]

النهج التكراري (باستخدام مُكدس): يمكن أن يؤدي التراجع إلى أخطاء تجاوز المكدس مع التداخل العميق للغاية. يوفر النهج التكراري باستخدام مُكدس قوة تحمل:


def flatten_iterative(nested_list):
    flat_list = []
    stack = [nested_list]
    while stack:
        current = stack.pop()
        if isinstance(current, list):
            stack.extend(current)
        else:
            flat_list.append(current)
    return flat_list

nested_list = [[1, 2, [3, 4]], [5, 6, [7, [8, 9]]]]
flat_list = flatten_iterative(nested_list)
print(flat_list)  # الإخراج: [1, 2, 3, 4, 5, 6, 7, 8, 9]

الخلاصة

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *