5 metod pro odstranění duplicitních položek ze seznamů Pythonu

V tomto tutoriálu se naučíte, jak odstranit duplicitní položky ze seznamů Pythonu.

Když pracujete se seznamy v Pythonu, možná budete někdy potřebovat pracovat pouze s jedinečnými položkami v seznamu – odstraněním duplikátů.

Můžete to udělat několika různými způsoby. V tomto tutoriálu si projdeme pět takových technik.

Základy seznamů Python

Začněme naši diskuzi zopakováním si základů seznamů Python.

Seznamy Pythonu jsou proměnlivý. Můžete je tedy upravit na místě přidáním a odebráním prvků ze seznamu. Seznamy Pythonu jsou navíc kolekce prvků, které nemusí být nutně jedinečné.

Jak tedy zachovat pouze jedinečné prvky a odstranit duplicitní nebo opakující se prvky?

No, můžete to udělat několika různými způsoby. Můžete buď vytvořit nový seznam, který bude obsahovat pouze jedinečné prvky původního seznamu. Nebo se můžete rozhodnout upravit původní seznam na místě a odstranit duplicitní položky.

To se podrobně naučíme v tomto tutoriálu.

Metody pro odstranění duplikátů ze seznamů Pythonu

Vezměme si příklad z reálného světa. Předpokládejme, že jste na oslavě narozenin svého přítele.🎊🎉

V zobrazené sbírce sladkostí vidíte některé položky, které se opakují. Nyní byste chtěli odstranit tyto duplicitní položky ze seznamu sladkostí.

Vytvořme seznam sladkostí obsahující všechny položky na obrázku výše.

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

Ve výše uvedeném seznamu sladkostí se položky ‚cukroví‘ a ‚cupcake‘ opakují dvakrát. Použijme tento příklad seznamu k odstranění duplicitních položek.

Opakujte seznamy Pythonu a odstraňte duplikáty

Nejjednodušší metodou je vytvořit nový seznam, který obsahuje každou položku právě jednou.

Přečtěte si níže uvedenou buňku s kódem:

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']
  • Inicializujeme prázdný seznam unique_sweets.
  • Při procházení seznamu sladkostí přistupujeme ke každé sladkosti.
  • Pokud sladkost ještě není přítomna v seznamu unique_sweets, přidáme ji na konec seznamu unique_sweets pomocí metody .append().
  Nejlepší vtipy, hry a velikonoční vajíčka pro Google Assistant

Předpokládejme, že narazíte na opakující se položku, například na druhý výskyt „cukroví“ v seznamu sladkostí. Toto není přidáno do seznamu unique_sweets, protože již existuje: sweet not in unique_sweets se vyhodnotí jako False pro druhý výskyt ‚cupcake‘ a ‚candy‘.

Proto se v této metodě každá položka vyskytuje v seznamu unique_sweets přesně jednou – bez jakéhokoli opakování.

K odstranění duplikátů použijte funkci List Comprehension

K naplnění seznamu unique_sweets můžete také použít porozumění seznamu.

Chcete si osvěžit základy porozumění seznamu?

▶️ Podívejte se na tutoriál o porozumění seznamu v Pythonu.

Použijme výraz pro porozumění seznamu: [output for item in iterable if condition is True] výstižně přepsat výše uvedenou smyčku.

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']

I když vytváříte nový seznam, nevyplňujete vytvořený seznam hodnotami. Je to proto, že výstupem je operace .append() do seznamu unique_sweets.

Chcete-li odstranit duplicitní položky ze seznamů Pythonu, můžete také použít vestavěné metody seznamu a tím se budeme zabývat v další části.

K odstranění duplikátů použijte vestavěné metody seznamu

K odstranění duplicitních položek můžete použít metody seznamu Python .count() a .remove().

– Se syntaxí list.count(value) vrací metoda .count() počet výskytů hodnoty v seznamu. Takže počet odpovídající opakujícím se položkám bude větší než 1.

– list.remove(value) odebere první výskyt hodnoty ze seznamu.

Pomocí výše uvedeného máme následující kód.

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']

Protože metoda .remove() odstraňuje pouze první výskyt hodnoty, nemůžete ji použít k odstranění položek, které se vyskytují více než dvakrát.

  • Pokud je určitá položka duplikována (vyskytuje se právě dvakrát), tato metoda odstraní první výskyt.
  • Pokud se určitá položka opakuje K-krát, pak po spuštění výše uvedeného kódu zůstanou opakování K-1 stále.
  Virtually Forgotten: Nintendo's Virtual Boy, 25 Years later

Ale obecně, když říkáme duplikáty, obvykle máme na mysli všechna opakování.

Chcete-li tento případ vyřešit, můžete upravit výše uvedenou smyčku a odstranit všechna opakování kromě jednoho. Namísto použití podmínky if ke kontrole počtu konkrétní položky můžete spustit smyčku while k opakovanému odstranění duplikací, dokud počet každé položky v seznamu nebude 1.

Seznam sladkostí nyní obsahuje 2 opakování ‚cupcake‘ a 3 opakování ‚cukroví‘.

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

K odstranění opakování můžete použít smyčku while, jak je znázorněno níže. Cyklus while běží tak dlouho, dokud je počet sladkostí ve sladkostech větší než 1. Když zůstane pouze jeden výskyt, podmínka sweets.count(sweet) > 1 se stane False a smyčka přeskočí na další položku.

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']

Používání vnořených smyček však nemusí být příliš efektivní, takže pokud pracujete s velkými seznamy, můžete zvážit použití jedné z dalších technik, o kterých se diskutuje.

Zatím jsme se dozvěděli následující:

  • Metody pro odstranění duplicitních položek ze seznamů Pythonu – vytvořením nových seznamů – obsahujících pouze jedinečné položky
  • Vestavěné metody seznamu .count() a .remove() pro úpravu seznamu na místě

Existují některé datové struktury vestavěné v Pythonu, které vyžadují, aby všechny hodnoty byly jedinečné – bez opakování. Proto můžeme přetypovat seznam Pythonu do jedné z těchto datových struktur, abychom odstranili duplikáty. A pak je převést zpět na seznam. Jak na to, se naučíme v následujících částech.

Odeslání seznamu Python do sady pro odstranění duplikátů

Sady Pythonu jsou kolekce prvků, které jsou všechny jedinečné. Proto je počet položek přítomných v sadě (daný pomocí len() roven počtu přítomných jedinečných prvků.

Libovolný iterovatelný Python můžete přetypovat do sady pomocí syntaxe: set(iterable).

Nyní vložme seznam sladkostí do sady a prozkoumáme výstup.

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

Z výstupu ve výše uvedené buňce kódu vidíme, že každá položka se objeví přesně jednou a duplikáty byly odstraněny.

  Jak zajistit přesnější odemykání otisků prstů na telefonu

Všimněte si také, že pořadí položek nemusí být nutně stejné jako jejich pořadí v původním seznamu sladkostí. Je to proto, že kromě kolekce jedinečných prvků je objekt sady Python neuspořádanou kolekcí.

Nyní, když jsme odstranili duplikáty odevzdáním seznamu do sady, můžeme jej znovu převést na seznam, jak je uvedeno níže.

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

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

Použijte položky seznamu jako klíče slovníku k odstranění duplicit

Pythonský slovník je sbírka párů klíč-hodnota, kde klíče jednoznačně identifikují hodnoty.

Slovník Pythonu můžete vytvořit pomocí metody .fromkeys() se syntaxí: dict.fromkeys(keys, values). Klíče a hodnoty jsou zde iterovatelné položky obsahující klíče a hodnoty slovníku.

  • keys je povinný parametr a může to být libovolný iterovatelný Python odpovídající klíčům slovníku.
  • hodnoty je volitelný parametr. Pokud nezadáte iterovatelné hodnoty, použije se výchozí hodnota Žádná.

Bez zadání hodnot vrátí dict.fromkeys(sweets) slovník Pythonu, kde jsou hodnoty nastaveny na Žádné – výchozí hodnota. Níže uvedená buňka s kódem to vysvětluje.

dict.fromkeys(sweets)

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

Stejně jako v předchozí části můžeme opět převést slovník na seznam, jak je uvedeno níže.

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

Z výše uvedeného výstupu vidíme, že duplicitní položky byly odstraněny ze seznamu sladkostí.

Shrnutí👩‍🏫

Zde je rekapitulace různých metod, které můžete použít k odstranění duplicitních položek nebo opakování ze seznamů Pythonu.

  • K přidání neopakujících se položek do nového seznamu použijte metodu pythonského seznamu .append(). Nový seznam obsahuje každou položku v původním seznamu přesně jednou a odstraní všechna opakování. Můžete to udělat také pomocí porozumění seznamu.
  • Pomocí vestavěných metod .count() a .remove() odstraňte položky, které se vyskytují přesně dvakrát. Totéž lze umístit do smyčky while a odstranit všechny další výskyty.
  • Přeneste seznam Pythonu do sady, abyste zachovali pouze jedinečné prvky.
  • Použijte dict.fromkeys(list) k odstranění všech duplikátů ze seznamu, protože by neměly být žádné opakující se klíče slovníku.

Dále se podívejte na projekty Pythonu, abyste si je mohli procvičit a naučit se. Nebo se naučte, jak najít index položky v seznamech Pythonu. Šťastné učení!