Mai mult
Eliminarea duplicate în liste
Destul de mult am nevoie pentru a scrie un program pentru a verifica daca o lista are orice duplicate și dacă nu se elimină-le și întoarce o nouă listă cu elementele care au fost't duplicat/eliminat. Aceasta este ceea ce am, dar sincer să fiu nu știu ce să fac.
def remove_duplicates():
t = ['a', 'b', 'c', 'd']
t2 = ['a', 'c', 'd']
for t in t2:
t.append(t.remove())
return t
871
47
Abordarea comună pentru a obține o colecție unică de elemente este de a utiliza un set. Seturi sunt neordonate colecții de distincte obiecte. Pentru a crea un set de la orice iterable, puteți trece pur și simplu la built-in [
set()
](http://docs.python.org/3/library/functions.html#func-set funcția). Dacă mai târziu nevoie de o lista din nou, în mod similar, puteți trece setat la [lista()
](http://docs.python.org/3/library/functions.html#func-list funcția).Următorul exemplu ar trebui să acopere orice ai încerca să faci:
După cum puteți vedea din exemplul urmare, ordinea inițială nu este menținută. După cum sa menționat mai sus, seturi înșiși sunt colecții neordonate, deci ordinea este pierdut. Când se face conversia de la un set înapoi la o listă, o ordine arbitrară este creat.
Pentru menținerea ordinii
Dacă scopul este de important pentru tine, atunci va trebui să utilizați un mecanism diferit. O soluție comună pentru acest lucru este să se bazeze pe
OrderedDict
să păstreze ordinea de chei timpul de inserție:Începând cu Python 3.7, built-in dicționar este garantat pentru a menține inserție pentru ca de bine, astfel încât să puteți utiliza, de asemenea, că în mod direct, dacă sunteți pe Python 3.7 sau mai târziu (sau CPython 3.6):
Rețineți că acest lucru are aeriene de a crea un dicționar în primul rând, și apoi a crea o listă de la ea. Dacă nu aveți de fapt nevoie pentru a păstra ordinea, esti mai bine folosind un set. Check out această întrebare pentru mai multe detalii și modalități alternative de a păstra ordinea, atunci când eliminarea duplicatelor.
În cele din urmă act de faptul că atât "set", precum și OrderedDict
/
dict soluții nevoie de un produs pentru a fi hashable. De obicei, aceasta înseamnă că ei trebuie să fie imuabile. Dacă ai de-a face cu elemente care nu sunt hashable (de exemplu, lista de obiecte), atunci va trebui să utilizați o abordare lent în care va în principiu, trebuie să compară fiecare element cu fiecare alt element într-o buclă imbricată.În Python 2.7, noul mod de a scoate duplicate dintr-un iterable în timp ce menținându-l în ordinea inițială este:
În Python 3.5, la OrderedDict are o implementare C. Timpii mei arată că acest lucru este cel mai rapid și cel mai scurt de diverse abordări pentru Python 3.5.
În Python 3.6, regulat dict a devenit atât de ordonat si compact. (Această caracteristică este valabil pentru CPython și PyPy dar nu poate prezenta în alte implementări). Asta ne dă un nou cel mai rapid mod de deduping păstrând în același timp pentru:
În Python 3.7, regulat dict este garantat pentru a comandat peste toate implementările. Deci, cea mai scurtă și mai rapidă soluție este:
L's o o-liner: lista(set(source_list))` va face truc.
Un " set " este ceva care poate't, eventual, au duplicate.
Update: un ordin de conservare abordare este de două linii:
Aici vom folosi faptul că
OrderedDict
își amintește de inserție scopul de chei, și să nu-l schimbe atunci când o valoare la o anumită cheie este actualizat. Vom introduce "Adevărat" ca valori, dar putem introduce nimic, valorile nu sunt utilizate. ("set" funcționează ca undict
cu ignorate de valori, de asemenea.)Dacă tu nu't grijă despre scopul, doar face acest lucru:
Un " set " este garantat de a nu fi duplicate.
Pentru a face o nouă listă de fixare ordinea de primele elemente de duplicate în
L
newlist=[ii pentru n,ii enumera(L) dacă a ii-a nu L[:n]]
de exemplu,
dacă Am=[1, 2, 2, 3, 4, 2, 4, 3, 5]`` apoi ``newlist
va fi[1,2,3,4,5]
Acest pas se verifică fiecare element nou nu a apărut anterior în lista înainte de a o adăuga. De asemenea, nu are nevoie de importuri.
Un coleg a trimis răspunsul acceptat ca parte din codul lui la mine pentru un codereview astăzi. În timp ce eu admir eleganta de a răspunde la întrebare, eu nu sunt fericit cu performanța. Am încercat această soluție (eu folosesc set pentru a reduce căutare de timp)
Pentru a compara eficiența, am folosit un eșantion aleatoriu de 100 de numere întregi - 62 au fost unice
Aici sunt rezultatele măsurătorilor
Ei bine, ce se întâmplă dacă setul este îndepărtat din soluție?
Rezultatul nu este la fel de rău ca și cu OrderedDict, dar încă mai mult de 3 ori de soluția inițială
Un alt mod de a face:
Există, de asemenea, soluții folosind Panda și Numpy. Amândoi se întoarcă numpy matrice deci va trebui să utilizați funcția
.tolist()
dacă doriți o listă.Panda soluție
Folosind Panda funcția
unic()
:Numpy soluție
Folosind numpy funcția
unic()
.Rețineți că numpy.unic (), de asemenea, un fel de valori. Deci lista " t2 " este returnat-a rezolvat. Dacă doriți să aveți pentru conservate utilizare ca în acest răspuns:
Soluția nu este atât de elegant în comparație cu alții, cu toate acestea, în comparație cu panda.unic(), numpy.unic() vă permite, de asemenea, pentru a verifica dacă tablouri imbricate sunt unice de-a lungul o anumită axă.
Simplu și ușor:
Ieșire:
Am avut un dict în lista mea, așa că nu am putut folosi metoda de mai sus. Am eroarea:
Deci, dacă îți pasă pentru și/sau unele elemente sunt unhashable. Atunci s-ar putea găsi acest util:
Unii ar putea lua în considerare lista de înțelegere cu un efect secundar de a nu fi o soluție bună. Aici's o alternativă:
Tot pentru menținerea abordărilor I'am văzut aici, atât de departe folosi fie naiv comparație (cu O(n^2) timp-complexitatea în cel mai bun) sau cu greutate grele
OrderedDicts
/ " set " + "listă" de combinații, care sunt limitate la hashable intrări. Aici este un hash-independent de O(nlogn) soluție:Update adăugat "cheia" de argument, documentare și Python 3 compatibilitate.
Dacă doriți să păstreze ordinea, și nu folosi orice module externe aici este o modalitate ușoară de a face acest lucru:
``python
Notă: Această metodă păstrează ordinea de apariție, așa cum am văzut mai sus, nouă va veni după o pentru că a fost prima dată când a apărut. Acest lucru însă, este același rezultat ca te-ar primi cu
python din colecțiile de import OrderedDict ulist=lista(OrderedDict.fromkeys(l))
dar este mult mai scurt, și rulează mai rapid.
Acest lucru funcționează pentru că de fiecare dată când
fromkeys funcția încearcă să creeze o nouă cheie, dacă valoarea deja există pur și simplu se va suprascrie. Acest lucru va afecta dicționar deloc cu toate acestea, ca
fromkeys` creează un dicționar în care toate cheile au valoarea "Nici unul", în mod eficient, astfel se elimina toate duplicatele acest fel.Încercați să utilizați seturi:
Ai putea, de asemenea, face acest lucru:
Motivul pentru care funcționează de mai sus este că "index" metoda returnează doar primul indice al unui element. Elemente duplicat fi mai mari indici. Consultați aici:
Reducerea varianta cu comanda conserva:
Să presupunem că avem lista:
Reduce variant (unefficient):
5 x mai rapid, dar mult mai sofisticat
Explicație:
Puteți utiliza următoarele funcții:
Exemplu:
Utilizare:
['asta', 'este', 'un', 'list', 'cu', 'dupicates', 'in', 'la']
Cea mai bună abordare de eliminarea duplicate dintr-o listă se utilizează set() funcție disponibilă în python, din nou, convertirea setați în listă
Există multe alte răspunsuri sugerează diferite moduri de a face acest lucru, dar ei're toate operațiunile de lot, iar unele dintre ele arunca ordinea inițială. Care ar putea fi bine în funcție de ceea ce aveți nevoie, dar dacă vrei să itera peste valorile în ordinea de primă instanță din fiecare valoare, și doriți pentru a elimina duplicatele de pe-the-fly față de toate la o dată, ai putea folosi acest generator:
Acesta returnează un generator/iterator, astfel încât să puteți folosi oriunde pe care le puteți folosi un iterator.
Ieșire:
Daca vrei o "listă", puteți face acest lucru:
Ieșire:
Fără a utiliza set