تحديد ما إذا كانت القائمة (المصفوفة) تحتوي على عناصر مكررة في بايثون

اعمال

فيما يلي وصف لكيفية تحديد ما إذا كانت القائمة (المصفوفة) تحتوي على عناصر مكررة (جميع العناصر فريدة / فريدة) في Python ، لكل حالة من الحالات التالية.

  • للحصول على قائمة بدون قائمة في العنصر
  • للقوائم التي تحتوي على قوائم بالعناصر (المصفوفات ثنائية الأبعاد ، قوائم القوائم ، إلخ.)

راجع المقالة التالية حول كيفية إزالة العناصر المكررة من القائمة أو استخراجها.

لاحظ أن القوائم يمكن أن تخزن أنواعًا مختلفة من البيانات وتختلف تمامًا عن المصفوفات. إذا كنت تريد التعامل مع المصفوفات في العمليات التي تتطلب حجم الذاكرة وعناوين الذاكرة أو المعالجة الرقمية للبيانات الكبيرة ، فاستخدم مصفوفة (مكتبة قياسية) أو NumPy.

تحديد ما إذا كانت هناك عناصر مكررة في القائمة (إذا كان العنصر لا يحتوي على قائمة)

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

نوع المجموعة هو نوع بيانات لا يحتوي على عناصر مكررة. عند تمرير قائمة إلى المُنشئ set () ، يتم تجاهل القيم المكررة ويتم إرجاع كائن من النوع مع قيم فريدة فقط كعناصر.

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

  • إذا تساوى عدد العناصر ، فلا توجد عناصر مكررة في القائمة الأصلية
  • يتم تضمين العناصر المكررة في القائمة الأصلية إذا كان عدد العناصر مختلفًا

الدوال التي ترجع خطأ إذا لم تكن هناك عناصر مكررة وصواب إذا كانت هناك عناصر مكررة هي كما يلي

def has_duplicates(seq):
    return len(seq) != len(set(seq))

l = [0, 1, 2]
print(has_duplicates(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates(l))
# True

المثال عبارة عن قائمة ، ولكن يمكن استخدام نفس الوظيفة مع المجموعات.

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

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

تحديد ما إذا كانت هناك عناصر مكررة في القائمة (إذا كان العنصر يحتوي على قائمة)

في حالة وجود قائمة تحتوي على قائمة عناصر (مثل قائمة القوائم) ، يمكن استخدام الوظائف التالية لتحديد ما إذا كانت هناك عناصر مكررة.

def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)

l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False

l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True

بدلاً من set () ، يُنشئ تدوين list comprehension قائمة تكون عناصرها قيمًا فريدة فقط ، ويتم مقارنة عدد العناصر. راجع المقالة التالية للحصول على التفاصيل.

هذه الوظيفة صالحة أيضًا للقوائم التي لا تحتوي على قائمة بالعناصر.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

المثال حتى الآن هو تحديد ما إذا كانت قائمة العناصر مكررة (تحتوي على نفس القائمة).

يمكن تحديد ما إذا كانت عناصر كل قائمة متداخلة بعد تسوية القائمة الأصلية إلى بُعد واحد.

l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]

print(has_duplicates(sum(l_2d, [])))
# False

l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True

هنا ، يتم استخدام sum () لتسطيح القائمة ، ولكن يمكن أيضًا استخدام itertools.chain.from_iterable (). بالإضافة إلى ذلك ، عند تسوية قائمة من ثلاثة أبعاد أو أكثر ، من الضروري تحديد وظيفة جديدة.