در زیر توضیحی درباره نحوه تعیین اینکه آیا یک لیست (آرایه) دارای عناصر تکراری است (همه عناصر منحصر به فرد هستند) در پایتون، برای هر یک از موارد زیر است.
- برای لیستی که هیچ لیستی در عنصر وجود ندارد
- برای لیست های دارای لیست عناصر (آرایه های دو بعدی، لیست لیست ها و غیره)
مقاله زیر را در مورد نحوه حذف یا استخراج عناصر تکراری از یک لیست ببینید.
توجه داشته باشید که لیست ها می توانند انواع مختلفی از داده ها را ذخیره کنند و کاملاً با آرایه ها متفاوت هستند. اگر میخواهید آرایههایی را در فرآیندهایی مدیریت کنید که به اندازه حافظه و آدرسهای حافظه یا پردازش عددی دادههای بزرگ نیاز دارند، از آرایه (کتابخانه استاندارد) یا NumPy استفاده کنید.
تعیین کنید که آیا عناصر تکراری در لیست وجود دارد (اگر عنصر لیستی نداشته باشد)
اگر عنصر یک شیء قابل به روز رسانی مانند یک لیست ندارد، از set() سازنده از نوع set استفاده کنید.
- مربوط:مجموعه عملیات (به عنوان مثال، تعیین مجموعه اتحادیه، مجموعه محصول، و زیر مجموعه) با نوع مجموعه پایتون
نوع مجموعه یک نوع داده است که هیچ عنصر تکراری ندارد. هنگامی که یک لیست به set() سازنده ارسال می شود، مقادیر تکراری نادیده گرفته می شوند و یک شی از نوع مجموعه با مقادیر منحصر به فرد به عنوان عناصر برگردانده می شود.
تعداد عناصر موجود در این شی نوع مجموعه و لیست اصلی با استفاده از تابع داخلی len() به دست آمده و مقایسه می شوند.
- اگر تعداد عناصر برابر باشد، هیچ عنصر تکراری در لیست اصلی وجود ندارد
- اگر تعداد عناصر متفاوت باشد، عناصر تکراری در لیست اصلی گنجانده می شوند
توابعی که در صورت عدم وجود عناصر تکراری false و در صورت وجود عناصر تکراری true را برمی گرداند به شرح زیر است.
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
مثال یک لیست است، اما همان تابع را می توان با تاپل ها استفاده کرد.
اشیاء قابل تغییر (قابل به روز رسانی) مانند لیست ها نمی توانند عناصری از نوع مجموعه باشند. بنابراین، لیست هایی با لیست به عنوان عناصر (آرایه های دو بعدی، لیست لیست ها و غیره) منجر به TypeError می شود. اقدام متقابل در زیر نشان داده شده است.
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()، نماد درک لیست لیستی را ایجاد می کند که عناصر آن فقط مقادیر منحصر به فرد هستند و تعداد عناصر با هم مقایسه می شود. برای جزئیات بیشتر به مقاله زیر مراجعه کنید.
این تابع برای لیست هایی که لیستی از عناصر ندارند نیز معتبر است.
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() نیز می تواند استفاده شود. علاوه بر این، هنگام مسطح کردن یک لیست از سه بعد یا بیشتر، لازم است یک تابع جدید تعریف شود.