5 метода за премахване на дублиращи се елементи от списъците на Python

В този урок ще научите как да премахвате дублирани елементи от списъците на Python.

Когато работите със списъци в Python, понякога може да се наложи да работите само с уникални елементи в списъка – като премахнете дубликатите.

Има няколко различни начина, по които можете да направите това. В този урок ще разгледаме пет такива техники.

Основи на списъците на Python

Нека започнем нашата дискусия, като прегледаме основите на списъците на Python.

Списъците на Python са променлив. Така че можете да ги променяте на място, като добавяте и премахвате елементи от списъка. Освен това списъците на Python са колекции от елементи, които не са непременно уникални.

И така, как да запазите само уникалните елементи и да премахнете дублиращите се или повтарящи се елементи?

Е, можете да направите това по няколко различни начина. Можете или да създадете нов списък, който съдържа само уникалните елементи в оригиналния списък. Или можете да изберете да промените оригиналния списък на място и да премахнете дублиращите се елементи.

Ще ги научим подробно в този урок.

Методи за премахване на дубликати от списъци на Python

Да вземем пример от реалния свят. Да предположим, че сте на рожден ден на свой приятел.🎊🎉

В показаната колекция от сладкиши виждате, че има някои елементи, които се повтарят. Сега бихте искали да премахнете тези дублиращи се елементи от списъка със сладкиши.

Нека създадем списък със сладкиши, съдържащ всички елементи от изображението по-горе.

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

В горния списък със сладкиши артикулите „бонбони“ и „кекс“ се повтарят два пъти. Нека използваме този примерен списък, за да премахнем дублиращите се елементи.

Повторете списъци на Python, за да премахнете дубликати

Най-простият метод е да създадете нов списък, който съдържа всеки елемент точно веднъж.

Прочетете кодовата клетка по-долу:

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, ние го добавяме в края на списъка unique_sweets с помощта на метода .append().
  Как да персонализирате новия раздел на Microsoft Edge

Да предположим, че попаднете на повтарящ се елемент, например второто появяване на „бонбони“ в списъка със сладкиши. Това не се добавя към списъка unique_sweets, тъй като вече присъства: sweet not in unique_sweets се оценява на False за второто появяване на „cupcake“ и „candy“.

Следователно в този метод всеки елемент се среща точно веднъж в списъка unique_sweets—без никакво повторение.

Използвайте List Comprehension за премахване на дубликати

Можете също да използвате разбирането на списъка, за да попълните списъка 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(), за да премахнете дублиращи се елементи.

– Със синтаксиса list.count(value), методът .count() връща броя пъти, когато стойността се появява в списъка. Така че броят, съответстващ на повтарящи се елементи, ще бъде по-голям от 1.

– list.remove(стойност) премахва първото срещане на стойност от списъка.

Използвайки горното, имаме следния код.

for sweet in sweets:
  # check if the count of sweet is > 1 (repeating item)
  if sweets.count(sweet) > 1:
  # if True, remove the first occurrence of sweet
    sweets.remove(sweet)

print(sweets)

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

Тъй като методът .remove() премахва само първото появяване на стойност, не можете да го използвате за премахване на елементи, които се срещат повече от два пъти.

  • Ако определен елемент се дублира (среща се точно два пъти), този метод премахва първото срещане.
  • Ако конкретен елемент се повтори K пъти, тогава след изпълнение на горния код, K-1 повторения все още ще останат.
  Как да копирате и поставите на Chromebook

Но като цяло, когато казваме дубликати, обикновено имаме предвид всички повторения.

За да се справите с този случай, можете да промените горния цикъл, за да премахнете всички повторения с изключение на едно. Вместо да използвате условен if за проверка на броя на конкретен елемент, можете да изпълните цикъл while за многократно премахване на дублирания, докато броят на всеки елемент в списъка стане 1.

Списъкът със сладкиши вече съдържа 2 повторения на „cupcake“ и 3 повторения на „bonbon“.

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

Можете да използвате цикъл while, за да премахнете повторенията, както е показано по-долу. Цикълът while продължава да работи, докато броят на сладките в сладкиши е по-голям от 1. Когато остане само едно срещане, условието sweets.count(sweet) > 1 става False и цикълът прескача към следващия елемент.

for sweet in sweets:
  # check if the count of sweet is > 1 (repeating item)
  while(sweets.count(sweet) > 1):
  # repeatedly remove the first occurrence of sweet until one occurrence remains.
    sweets.remove(sweet)

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

Но използването на вложени цикли може да не е много ефективно, така че можете да обмислите използването на някоя от другите обсъждани техники, ако работите с големи списъци.

Досега сме научили следното:

  • Методи за премахване на дублирани елементи от списъци на Python – чрез създаване на нови списъци – съдържащи само уникални елементи
  • Вградени списъчни методи .count() и .remove() за промяна на списъка на място

Има някои вградени в Python структури от данни, които изискват всички стойности да бъдат уникални – без повторения. Следователно можем да прехвърлим списък на Python към една от тези структури от данни, за да премахнем дубликати. И след това ги преобразувайте обратно в списък. Ще научим как да направим това в следващите раздели.

Прехвърляне на Python List в набор за премахване на дубликати

Наборите на Python са колекции от елементи, които са уникални. Следователно броят на присъстващите елементи в набора (дадени от len() е равен на броя на наличните уникални елементи.

Можете да прехвърлите всеки итерируем Python в набор, като използвате синтаксиса: set(iterable).

  Как да управлявате Hulu акаунт

Сега, нека хвърлим списъка със сладкиши в набор и да разгледаме резултата.

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 е задължителен параметър и може да бъде всеки итерируем Python, съответстващ на ключовете на речника.
  • стойности е незадължителен параметър. Ако не посочите итерируемите стойности, се използва стойността по подразбиране 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.

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

След това вижте проекти на Python, за да практикувате и да научите. Или научете как да намерите индекса на елемент в списъците на Python. Приятно учене!