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().
Праверце гэта:  Як адключыць анімацыю на андроід [No Root]

Выкажам здагадку, вы сутыкнуліся з паўтаральным пунктам, напрыклад, другім з’яўленнем “цукеркі” ў спісе прысмакаў. Гэта не дадаецца ў спіс unique_sweets, паколькі ён ужо прысутнічае: sweet 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(), каб выдаліць дублікаты элементаў.

– З сінтаксісам 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 усё роўна застануцца.

Але ў цэлым, калі мы кажам дублікаты, мы звычайна маем на ўвазе ўсе паўторы.

Праверце гэта:  Як імпартаваць нататкі і сшыткі з Evernote у OneNote

Каб справіцца з гэтым выпадкам, вы можаце змяніць прыведзены вышэй цыкл, каб выдаліць усе паўторы, акрамя аднаго. Замест таго, каб выкарыстоўваць умову if для праверкі колькасці пэўнага элемента, вы можаце запусціць цыкл while для паўторнага выдалення дублікатаў, пакуль колькасць кожнага элемента ў спісе не стане 1.

Спіс прысмакаў цяпер змяшчае 2 паўторы “кекс” і 3 паўторы “цукеркі”.

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 у набор для выдалення дублікатаў

Наборы Python – гэта наборы унікальных элементаў. Такім чынам, колькасць элементаў, якія прысутнічаюць у наборы (задаецца len()), роўная колькасці унікальных элементаў, якія прысутнічаюць.

Вы можаце перавесці любы ітэрацыйны Python у набор, выкарыстоўваючы сінтаксіс: set(iterable).

А цяпер давайце збяром прысмакі са спісу ў набор і праверым вынік.

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

З вываду ў прыведзенай вышэй ячэйцы кода мы бачым, што кожны элемент з’яўляецца роўна адзін раз, а дублікаты былі выдалены.

Акрамя таго, звярніце ўвагу, што парадак прадметаў не абавязкова адпавядае іх парадку ў зыходным спісе прысмакаў. Гэта адбываецца таму, што, акрамя калекцыі унікальных элементаў, наборны аб’ект Python з’яўляецца неўпарадкаванай калекцыяй.

Праверце гэта:  Як абмежаваць даныя ў табліцах Google з дапамогай праверкі дадзеных

Цяпер, калі мы выдалілі дублікаты, ператварыўшы спіс у набор, мы можам зноў пераўтварыць яго ў спіс, як паказана ніжэй.

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

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

Выкарыстоўвайце элементы спісу ў якасці ключоў слоўніка для выдалення дублікатаў

Слоўнік Python – гэта набор пар ключ-значэнне, дзе ключы адназначна вызначаюць значэнні.

Вы можаце стварыць слоўнік Python з дапамогай метаду .fromkeys() з сінтаксісам: dict.fromkeys(ключы, значэнні). Тут ключы і значэнні – гэта ітэрацыйныя элементы, якія змяшчаюць ключы і значэнні слоўніка адпаведна.

  • ключы з’яўляюцца абавязковым параметрам, і гэта можа быць любы ітэрам Python, які адпавядае ключам слоўніка.
  • значэнні – неабавязковы параметр. Калі вы не ўказваеце значэнні, якія можна ітэраваць, выкарыстоўваецца значэнне па змаўчанні None.

Без указання значэнняў dict.fromkeys(sweets) вяртае слоўнік Python, у якім для значэнняў усталявана “Няма” – значэнне па змаўчанні. Ячэйка кода ніжэй тлумачыць гэта.

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. Шчаслівага навучання!