5 методів видалення повторюваних елементів зі списків Python

Як позбутися повторень у списках Python?

У цьому посібнику ми розглянемо способи усунення дублікатів зі списків Python. Якщо ви працюєте зі списками, часто виникає потреба мати справу лише з унікальними елементами, відкидаючи повтори.

Існує кілька методів досягнення цієї мети. Далі ми детально розглянемо п’ять різних підходів.

Що варто знати про списки Python

Перш ніж заглибитися в методи видалення дублікатів, давайте згадаємо основи роботи зі списками Python.

Списки в Python є змінюваними структурами даних. Це означає, що ви можете змінювати їх безпосередньо, додаючи або видаляючи елементи. Крім того, списки можуть містити повторювані елементи.

Отже, як виокремити лише унікальні елементи, позбувшись від дублікатів?

Це можна зробити кількома способами. Ви можете створити новий список, що міститиме лише унікальні елементи з вихідного. Або ж ви можете модифікувати вихідний список, видаливши з нього повтори.

Далі ми докладно розглянемо ці підходи.

Методи видалення дублікатів зі списків Python

Уявімо собі приклад. Ви на дні народження у друга. 🎊🎉

Серед різноманітних солодощів ви помічаєте, що деякі з них повторюються. Ваше завдання – створити список, де кожна солодощ буде представлена лише один раз.

Створимо список солодощів на основі зображення:

sweets = ["cupcake","candy","lollipop","cake","lollipop","cheesecake","candy","cupcake"]

У цьому списку елементи “цукерки” та “кекс” повторюються двічі. Використаємо цей приклад для демонстрації методів видалення дублікатів.

Видалення дублікатів через ітерацію списку

Найпростіший спосіб – створити новий список, де кожен елемент з’явиться лише один раз.

Розгляньте наступний код:

unique_sweets = []
for sweet in sweets:
  if sweet not in unique_sweets:
    unique_sweets.append(sweet)

print(unique_sweets)

# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']
  • Спочатку створюємо порожній список unique_sweets.
  • Потім проходимося по списку солодощів, перевіряючи кожен елемент.
  • Якщо елемент ще не присутній у unique_sweets, ми додаємо його в кінець цього списку за допомогою методу .append().

Припустимо, ми натрапили на повторний елемент, наприклад, друге входження “цукерок”. Воно не додається до unique_sweets, оскільки воно вже там є. Умова “солодке not in unique_sweets” повертає False для другого входження “кексу” і “цукерки”.

Таким чином, кожен елемент у списку unique_sweets з’являється лише один раз, без будь-яких повторів.

Використання спискового включення для видалення дублікатів

Ви також можете використати спискове включення, щоб створити список unique_sweets.

Бажаєте оновити знання про спискові включення?

▶️ Перегляньте посібник про спискові включення в Python.

Використаємо наступну структуру спискового включення: [output for item in iterable if condition is True] для лаконічного запису циклу з попереднього прикладу.

unique_sweets = []
[unique_sweets.append(sweet) for sweet in sweets if sweet not in unique_sweets]
print(unique_sweets)

# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

У цьому випадку ми створюємо новий список, але не заповнюємо його значеннями безпосередньо. Результатом є операція .append() до списку unique_sweets.

Для видалення дублікатів зі списків Python можна використовувати і вбудовані методи. Розглянемо їх у наступному розділі.

Використання вбудованих методів для видалення дублікатів

Методи списків Python .count() і .remove() також можуть допомогти у видаленні повторюваних елементів.

– Метод .count(), з синтаксисом list.count(value), повертає кількість разів, коли значення зустрічається в списку. Повторювані елементи матимуть кількість входжень більшу за 1.

– Метод list.remove(value) видаляє перше входження значення зі списку.

Використовуючи ці методи, отримаємо наступний код:

for sweet in sweets:
  # перевіряємо, чи кількість входжень елементу sweet > 1 (повторюваний елемент)
  if sweets.count(sweet) > 1:
  # якщо так, то видаляємо перше входження елемента sweet
    sweets.remove(sweet)

print(sweets)

# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

Оскільки .remove() видаляє лише перше входження значення, його не можна використовувати для видалення елементів, які трапляються більше двох разів.

  • Якщо елемент дублюється (зустрічається рівно двічі), цей метод видаляє перше входження.
  • Якщо елемент повторюється K разів, то після виконання коду вище залишаться K-1 повторень.

Загалом, коли ми говоримо про дублікати, маємо на увазі всі повторення.

Щоб обробити цей випадок, можна модифікувати цикл, щоб видаляти всі повторення, крім одного. Замість перевірки за допомогою if, ми використаємо цикл while, який буде видаляти дублікати до тих пір, поки кількість кожного елемента в списку не стане 1.

Припустимо, що список солодощів тепер містить 2 повторення “кексу” і 3 повторення “цукерки”.

sweets = ["cupcake","candy","lollipop","cake","lollipop","candy","cheesecake","candy","cupcake"]

Використаємо цикл while для видалення повторень, як показано нижче. Цикл продовжує працювати, поки кількість входжень sweet в sweets більше за 1. Як тільки залишається лише один елемент, умова sweets.count(sweet) > 1 стає False і цикл переходить до наступного елемента.

for sweet in sweets:
  # перевіряємо, чи кількість входжень sweet > 1 (повторюваний елемент)
  while(sweets.count(sweet) > 1):
  # неодноразово видаляємо перше входження sweet доки не залишиться лише одне входження.
    sweets.remove(sweet)

print(sweets)
# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

Проте, використання вкладених циклів може бути неефективним, особливо при роботі з великими списками. У такому випадку варто розглянути інші методи.

На даний момент ми розглянули наступні способи:

  • Методи видалення дублікатів зі списків Python шляхом створення нових списків з унікальними елементами.
  • Використання вбудованих методів .count() та .remove() для зміни списку безпосередньо.

Існують вбудовані структури даних Python, де всі значення повинні бути унікальними. Ми можемо перетворити список Python в одну з цих структур, щоб видалити дублікати. Після цього можна перетворити його назад у список. Далі розглянемо, як це зробити.

Перетворення списку Python у набір для видалення дублікатів

Набори Python – це колекції унікальних елементів. Кількість елементів у наборі (отримана за допомогою len()) відповідає кількості унікальних елементів.

Ви можете перетворити будь-яку ітеровану структуру даних Python в набір за допомогою синтаксису: set(iterable).

Давайте перетворимо наш список солодощів на набір і перевіримо результат:

set(sweets)
# Output
{'cake', 'candy', 'cheesecake', 'cupcake', 'lollipop'}

З результатів видно, що кожен елемент зустрічається лише один раз. Дублікати видалено.

Також слід зазначити, що порядок елементів у наборі може відрізнятися від порядку у вихідному списку. Набір Python не тільки є колекцією унікальних елементів, але і не гарантує порядок.

Тепер, коли дублікати видалено, ми можемо знову перетворити набір у список:

unique_sweets = list(set(sweets))
print(unique_sweets)

# Output
['cake', 'cheesecake', 'candy', 'cupcake', 'lollipop']

Використання елементів списку як ключів словника для видалення дублікатів

Словник Python – це набір пар ключ-значення, де ключі є унікальними ідентифікаторами значень.

Ви можете створити словник Python за допомогою методу .fromkeys() із синтаксисом: dict.fromkeys(keys, values). keys та values – це ітераційні об’єкти, які містять ключі та значення словника відповідно.

  • keys є обов’язковим параметром та може бути будь-яким ітерованим об’єктом Python, що містить ключі словника.
  • values є необов’язковим параметром. Якщо не вказати значення, буде використано значення за замовчуванням None.

Якщо не вказати значення, то dict.fromkeys(sweets) поверне словник Python, де значення всіх ключів буде None. Наступний код демонструє це.

dict.fromkeys(sweets)

# Output
{'cake': None,
 'candy': None,
 'cheesecake': None,
 'cupcake': None,
 'lollipop': None}

Як і у попередньому розділі, ми можемо перетворити словник назад у список.

unique_sweets = list(dict.fromkeys(sweets))
print(unique_sweets)
# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

З результатів видно, що дублікати елементів зі списку солодощів видалено.

Підсумки👩‍🏫

Ось підсумок різних методів, які можна використовувати для видалення повторюваних елементів зі списків Python:

  • Використовуйте метод .append() для додавання елементів, що не повторюються, до нового списку. Новий список міститиме кожен елемент з початкового списку лише один раз. Те ж саме можна зробити за допомогою спискового включення.
  • Використовуйте вбудовані методи .count() і .remove() для видалення елементів, які зустрічаються рівно двічі. Використовуйте цикл while для видалення всіх повторів, крім одного.
  • Перетворіть список Python у набір, щоб зберегти лише унікальні елементи.
  • Використовуйте dict.fromkeys(list) для видалення дублікатів зі списку, оскільки словник не може мати однакових ключів.

Пропонуємо попрактикуватися на проектах Python. Або вивчіть, як знайти індекс елемента в списках Python. Вдалого навчання!