Diezgan daudz man ir nepieciešams uzrakstīt programmu, lai pārbaudītu, vai sarakstā ir kādi dublikāti, un, ja tas ir, tas tos noņem un atgriež jaunu sarakstu ar elementiem, kas netika dublēti/likvidēti. Tas ir tas, kas man ir, bet, ja godīgi, es nezinu, ko darīt.
def remove_duplicates():
t = ['a', 'b', 'c', 'd']
t2 = ['a', 'c', 'd']
for t in t2:
t.append(t.remove())
return t
Lai iegūtu unikālu elementu kolekciju, parasti izmanto `set
. Komplekti ir nešķirīgu objektu nešķirīgu kolekcijas. Lai izveidotu kopu no jebkuras iterables, to var vienkārši nodot iebūvētajai funkcijai set()
. Ja vēlāk jums atkal būs nepieciešams reāls saraksts, jūs varat līdzīgi nodot kopu funkcijai list()
.
Tālāk sniegtajam piemēram vajadzētu aptvert visu, ko jūs mēģināt darīt:
>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> t
[1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> list(set(t))
[1, 2, 3, 5, 6, 7, 8]
>>> s = [1, 2, 3]
>>> list(set(t) - set(s))
[8, 5, 6, 7]
Kā redzams no piemēra rezultāta, izcelsmes secība netiek saglabāta. Kā minēts iepriekš, kopas pašas par sevi ir nesakārtotas kolekcijas, tāpēc kārtība tiek zaudēta. Konvertējot kopu atpakaļ uz sarakstu, tiek izveidota patvaļīga secība.
Ja jums ir svarīga kārtība, tad jums būs jāizmanto cits mehānisms. Ļoti izplatīts risinājums ir paļauties uz OrderedDict
, lai saglabātu atslēgu secību ievietošanas laikā:
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Sākot ar Python 3.7, iebūvētajai vārdnīcai ir garantēta arī ievietošanas kārtības saglabāšana, tāpēc to var izmantot arī tieši, ja lietojat Python 3.7 vai jaunāku (vai CPython 3.6):
>>> list(dict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Ņemiet vērā, ka tas ir saistīts ar vārdnīcas izveidošanu un pēc tam saraksta izveidošanu no tās. Ja jums patiesībā nav nepieciešams saglabāt secību, labāk izmantot kopu. Sīkāku informāciju un alternatīvus veidus, kā saglabāt secību, likvidējot dublikātus, skatiet šis jautājums.
Visbeidzot, ņemiet vērā, ka gan set
, gan OrderedDict
/dict
risinājumam ir nepieciešams, lai jūsu elementi būtu hashable. Tas parasti nozīmē, ka tiem jābūt nemainīgiem. Ja jums jārīkojas ar elementiem, kas nav hešējami (piemēram, saraksta objekti), tad jums būs jāizmanto lēna pieeja, kurā jums būtībā būs jāsalīdzina katrs elements ar katru citu elementu ieloka cilpā.
Tas ir vienkāršs: list(set(source_list))
paveiks šo triku.
Set
ir kaut kas tāds, kam nevar būt dublēšanās.
Atjauninājums: kārtības saglabāšanas pieeja ir divas rindas:
from collections import OrderedDict
OrderedDict((x, True) for x in source_list).keys()
Šeit mēs izmantojam to, ka OrderedDict
atceras atslēgu ievietošanas secību un nemaina to, kad tiek atjaunināta vērtība pie konkrētas atslēgas. Mēs iestarpinām True
kā vērtības, bet mēs varētu iestarpināt jebko, vērtības vienkārši netiek izmantotas. (set
darbojas līdzīgi kā dict
ar ignorētām vērtībām.)