V tomto návodu se naučíte, jakým způsobem efektivně odstranit opakující se prvky z seznamů v Pythonu.
Při manipulaci se seznamy v Pythonu se může stát, že potřebujete pracovat pouze s unikátními hodnotami, což znamená, že je nutné odstranit duplikáty.
Existuje několik různých přístupů, jak toho dosáhnout. V tomto článku prozkoumáme pět osvědčených technik.
Základní principy seznamů v Pythonu
Než se pustíme do samotného odstraňování duplicit, pojďme si stručně zopakovat základy práce se seznamy v Pythonu.
Seznamy v Pythonu jsou modifikovatelné, což znamená, že je lze přímo upravovat přidáváním a odebíráním prvků. Seznamy Pythonu mohou navíc obsahovat i duplicitní položky, ne pouze unikátní.
Jak tedy zajistíme, že v seznamu zůstanou pouze unikátní prvky a odstraníme všechny duplikáty?
Existuje několik způsobů. Buď můžete vytvořit nový seznam, který bude obsahovat pouze jedinečné položky z původního seznamu, nebo můžete upravit stávající seznam tak, že z něj odstraníte duplicitní položky.
V tomto návodu se podíváme na obě tyto možnosti.
Metody pro eliminaci duplicitních prvků ze seznamů Pythonu
Představme si praktickou situaci. Jste na oslavě narozenin vašeho přítele.🎊🎉
Mezi dobrotami vidíte některé, které se opakují. Nyní byste chtěli ze seznamu sladkostí odstranit duplicitní položky.
Vytvořme si seznam sladkostí, který bude obsahovat všechny položky z obrázku výše.
sweets = ["cupcake","candy","lollipop","cake","lollipop","cheesecake","candy","cupcake"]
V daném seznamu se položky ‚candy‘ a ‚cupcake‘ objevují dvakrát. Využijeme tento seznam k odstranění duplicitních položek.
Iterace přes seznamy Pythonu a odstranění duplikátů
Nejjednodušší metodou je vytvoření nového seznamu, který bude obsahovat každou položku pouze jednou.
Podívejte se na kód níže:
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']
- Nejprve vytvoříme prázdný seznam s názvem `unique_sweets`.
- Projdeme každý prvek (sladkost) v původním seznamu `sweets`.
- Pokud daná sladkost v seznamu `unique_sweets` ještě neexistuje, přidáme ji na konec tohoto seznamu pomocí metody `.append()`.
Předpokládejme, že narazíte na opakující se položku, například na druhý výskyt „candy“ v seznamu `sweets`. Tato položka nebude do seznamu `unique_sweets` přidána, protože tam již existuje: `sweet not in unique_sweets` se v případě druhého výskytu ‚cupcake‘ a ‚candy‘ vyhodnotí jako `False`.
Díky tomuto postupu se v novém seznamu `unique_sweets` objeví každá položka přesně jednou – bez opakování.
Využití List Comprehension pro odstranění duplicit
K naplnění seznamu `unique_sweets` lze využít i techniku zvanou „list comprehension“ (generátor seznamu).
Potřebujete si připomenout základy list comprehension?
▶️ Projděte si náš tutoriál o „list comprehension“ v Pythonu.
Použijeme výraz pro „list comprehension“: `[výstup for položka in iterovatelný_objekt if podmínka je True]` pro elegantní přepsání výše uvedené smyčky.
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']
V tomto případě nevytváříme nový seznam, ale měníme existující seznam `unique_sweets` přímo. Je to proto, že výstupem je operace `.append()` do seznamu `unique_sweets`.
K odstranění duplicit z pythonovských seznamů můžeme využít i vestavěné metody seznamů, a tím se budeme zabývat v další části.
Použití vestavěných metod seznamů k odstranění duplikátů
Pro odstranění duplicit můžete použít metody seznamu Pythonu `.count()` a `.remove()`.
– Pomocí syntaxe `list.count(hodnota)` metoda `.count()` vrátí počet výskytů dané hodnoty v seznamu. Počet opakujících se položek tedy bude větší než 1.
– `list.remove(hodnota)` odstraní první výskyt dané hodnoty ze seznamu.
Na základě výše uvedeného máme následující kód:
for sweet in sweets: # kontrola, zda je počet výskytů 'sweet' > 1 (opakující se položka) if sweets.count(sweet) > 1: # pokud je podmínka pravdivá, odebereme první výskyt 'sweet' sweets.remove(sweet) print(sweets) # Output ['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']
Protože metoda `.remove()` odstraní pouze první výskyt hodnoty, nelze ji použít k odstranění položek, které se vyskytují více než dvakrát.
- Pokud je určitá položka duplikovaná (vyskytuje se právě dvakrát), tato metoda odstraní první výskyt.
- Pokud se určitá položka opakuje K-krát, po spuštění výše uvedeného kódu zůstanou K-1 opakování.
Nicméně, když hovoříme o duplikátech, obvykle myslíme na všechna opakování.
Abychom vyřešili tento problém, můžeme upravit výše uvedenou smyčku a odstranit všechna opakování kromě jednoho. Místo použití podmínky `if` pro kontrolu počtu konkrétní položky můžete použít smyčku `while` k opakovanému odstraňování duplikátů, dokud počet každé položky v seznamu nebude roven 1.
Seznam sladkostí nyní obsahuje 2 opakování ‚cupcake‘ a 3 opakování ‚candy‘.
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 výskytů `sweet` v seznamu `sweets` větší než 1. Jakmile zůstane pouze jeden výskyt, podmínka `sweets.count(sweet) > 1` se vyhodnotí jako `False` a smyčka přejde na další položku.
for sweet in sweets: # kontrola, zda je počet výskytů 'sweet' > 1 (opakující se položka) while(sweets.count(sweet) > 1): # opakovaně odstraňuje první výskyt 'sweet', dokud nezůstane jen jeden sweets.remove(sweet) print(sweets) # Output ['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']
Nicméně použití vnořených smyček nemusí být nejefektivnější, a proto pokud pracujete s rozsáhlými seznamy, měli byste zvážit použití jedné z dalších technik, o kterých si povíme.
Zatím jsme se naučili:
- Metody pro eliminaci 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 přímo.
V Pythonu existují datové struktury, které vyžadují, aby všechny hodnoty byly unikátní – bez opakování. Proto můžeme převést seznam Pythonu na jednu z těchto datových struktur, abychom odstranili duplikáty. A poté ji opět převést zpět na seznam. Jak na to, se naučíme v následujících částech.
Převod seznamu Pythonu na množinu pro odstranění duplikátů
Množiny v Pythonu jsou kolekce prvků, kde všechny prvky musí být jedinečné. Proto je počet prvků v množině (získaný pomocí `len(
Libovolný iterovatelný objekt v Pythonu můžete převést na množinu pomocí syntaxe: `set(iterovatelný_objekt)`.
Nyní vložme seznam sladkostí do množiny a podívejme se na výstup.
set(sweets) # Output {'cake', 'candy', 'cheesecake', 'cupcake', 'lollipop'}
Z výstupu v uvedeném kódu je patrné, že se každá položka objevuje právě jednou a duplikáty byly odstraněny.
Také si všimněte, že pořadí položek nemusí být stejné jako v původním seznamu sladkostí. Je to proto, že kromě toho, že je množina kolekcí jedinečných prvků, je také neuspořádanou kolekcí.
Nyní, když jsme odstranili duplikáty převodem seznamu do množiny, můžeme jej opět převést zpět na seznam, jak je uvedeno níže.
unique_sweets = list(set(sweets)) print(unique_sweets) # Output ['cake', 'cheesecake', 'candy', 'cupcake', 'lollipop']
Využití prvků seznamu jako klíčů slovníku pro odstranění duplikátů
Pythonovský slovník je kolekce párů klíč-hodnota, kde klíče jednoznačně identifikují hodnoty.
Slovník Pythonu lze vytvořit pomocí metody `.fromkeys()` se syntaxí: `dict.fromkeys(klíče, hodnoty)`. Klíče a hodnoty jsou zde iterovatelné objekty obsahující klíče a hodnoty slovníku.
- `klíče` je povinný parametr a může to být libovolný iterovatelný objekt Pythonu odpovídající klíčům slovníku.
- `hodnoty` je volitelný parametr. Pokud nezadáte iterovatelný objekt pro hodnoty, použije se výchozí hodnota `None`.
Pokud nezadáte hodnoty, `dict.fromkeys(sweets)` vrátí slovník Pythonu, kde jsou hodnoty nastaveny na `None` – výchozí hodnotu. Následující kód to ilustruje.
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ýstupu výše můžeme vidět, ž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ů v Pythonu.
- K přidání neopakujících se položek do nového seznamu použijte metodu pythonovského seznamu `.append()`. Nový seznam obsahuje každou položku v původním seznamu právě jednou a odstraní všechna opakování. Můžete to udělat i pomocí „list comprehension“.
- Pomocí vestavěných metod `.count()` a `.remove()` odstraňte položky, které se vyskytují přesně dvakrát. Stejný princip lze vložit do smyčky `while` pro odstranění všech dalších výskytů.
- Převeďte seznam Pythonu na množinu, abyste zachovali pouze jedinečné prvky.
- Použijte `dict.fromkeys(seznam)` k odstranění všech duplikátů ze seznamu, protože ve slovníku by neměly existovat opakující se klíče.
Dále se můžete podívat na projekty v Pythonu, abyste si procvičili nově nabyté dovednosti. Nebo se naučte, jak najít index položky v seznamu v Pythonu. Přejeme vám příjemné učení!