Ik wil de unieke waarden uit de volgende lijst halen:
['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']
De uitvoer die ik nodig heb is:
['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']
Deze code werkt:
output = []
for x in trends:
if x not in output:
output.append(x)
print(output)
is er een betere oplossing die ik zou moeten gebruiken?
Antwoord 1, autoriteit 100%
Declareer eerst je lijst correct, gescheiden door komma’s. U kunt de unieke waarden verkrijgen door de lijst naar een set te converteren.
mylist = ['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']
myset = set(mylist)
print(myset)
Als je het verder als een lijst gebruikt, moet je het terug naar een lijst converteren door het volgende te doen:
mynewlist = list(myset)
Een andere mogelijkheid, waarschijnlijk sneller, is om vanaf het begin een set te gebruiken in plaats van een lijst. Dan zou je code moeten zijn:
output = set()
for x in trends:
output.add(x)
print(output)
Zoals is opgemerkt, behouden sets de oorspronkelijke volgorde niet. Als je dat nodig hebt, zoek dan naar een bestelde set implementatie (zie deze vraag voor meer).
Antwoord 2, autoriteit 31%
Om consistent te zijn met het type dat ik zou gebruiken:
mylist = list(set(mylist))
Antwoord 3, autoriteit 13%
Als we de elementen op volgorde moeten houden, wat dacht je van dit:
used = set()
mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
unique = [x for x in mylist if x not in used and (used.add(x) or True)]
En nog een oplossing met reduce
en zonder de tijdelijke used
var.
mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
unique = reduce(lambda l, x: l.append(x) or l if x not in l else l, mylist, [])
UPDATE – Dec, 2020 – Misschien wel de beste aanpak!
Vanaf python 3.7, het standaard dict behoudt de invoegvolgorde.
Gewijzigd in versie 3.7: Woordenboekvolgorde is gegarandeerd invoegvolgorde. Dit gedrag was een implementatiedetail van CPython uit 3.6.
Dit geeft ons dus de mogelijkheid om dict.from_keys
te gebruiken voor de-duplicatie!
OPMERKING: Credits gaan naar @rlat voor het geven van deze aanpak in de opmerkingen!
mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
unique = list(dict.fromkeys(mylist))
In termen van snelheid – voor mij is het snel genoeg en leesbaar genoeg om mijn nieuwe favoriete aanpak te worden!
UPDATE – maart 2019
En een derde oplossing, wat een nette oplossing is, maar een beetje traag omdat .index
O(n) is.
mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
unique = [x for i, x in enumerate(mylist) if i == mylist.index(x)]
UPDATE – okt 2016
Een andere oplossing met reduce
, maar deze keer zonder .append
waardoor het voor mensen leesbaarder en gemakkelijker te begrijpen is.
mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
unique = reduce(lambda l, x: l+[x] if x not in l else l, mylist, [])
#which can also be writed as:
unique = reduce(lambda l, x: l if x in l else l+[x], mylist, [])
OPMERKING: Houd er rekening mee dat het script beter leesbaar voor mensen wordt, en slechter presteert. Behalve alleen voor de dict.from_keys
-aanpak die specifiek is voor Python 3.7+.
import timeit
setup = "mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']"
#10x to Michael for pointing out that we can get faster with set()
timeit.timeit('[x for x in mylist if x not in used and (used.add(x) or True)]', setup='used = set();'+setup)
0.2029558869980974
timeit.timeit('[x for x in mylist if x not in used and (used.append(x) or True)]', setup='used = [];'+setup)
0.28999493700030143
# 10x to rlat for suggesting this approach!
timeit.timeit('list(dict.fromkeys(mylist))', setup=setup)
0.31227896199925453
timeit.timeit('reduce(lambda l, x: l.append(x) or l if x not in l else l, mylist, [])', setup='from functools import reduce;'+setup)
0.7149233570016804
timeit.timeit('reduce(lambda l, x: l+[x] if x not in l else l, mylist, [])', setup='from functools import reduce;'+setup)
0.7379565160008497
timeit.timeit('reduce(lambda l, x: l if x in l else l+[x], mylist, [])', setup='from functools import reduce;'+setup)
0.7400134069976048
timeit.timeit('[x for i, x in enumerate(mylist) if i == mylist.index(x)]', setup=setup)
0.9154880290006986
OPMERKINGEN BEANTWOORDEN
Omdat @monica een goede vraag stelde over “hoe werkt dit?”. Voor iedereen die er moeite mee heeft om het uit te zoeken. Ik zal proberen een meer diepgaande uitleg te geven over hoe dit werkt en welke tovenarij hier gebeurt 😉
Dus vroeg ze eerst:
Ik probeer te begrijpen waarom
unique = [used.append(x) for x in mylist if x not in used]
niet werkt.
Nou, het werkt echt
>>> used = []
>>> mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
>>> unique = [used.append(x) for x in mylist if x not in used]
>>> print used
[u'nowplaying', u'PBS', u'job', u'debate', u'thenandnow']
>>> print unique
[None, None, None, None, None]
Het probleem is dat we gewoon niet de gewenste resultaten krijgen binnen de unique
variabele, maar alleen binnen de used
variabele. Dit komt omdat tijdens het lijstbegrip .append
de used
-variabele wijzigt en None
retourneert.
Dus om de resultaten in de unique
variabele te krijgen en nog steeds dezelfde logica te gebruiken met .append(x) if x not in used
, moeten we verplaats deze .append
-aanroep naar de rechterkant van het lijstbegrip en retourneer gewoon x
aan de linkerkant.
Maar als we te naïef zijn en gewoon gaan met:
>>> unique = [x for x in mylist if x not in used and used.append(x)]
>>> print unique
[]
We krijgen er niets voor terug.
Nogmaals, dit komt omdat de methode .append
None
retourneert, en dit geeft op onze logische uitdrukking het volgende uiterlijk:
x not in used and None
Dit zal in principe altijd:
- evalueert tot
False
wanneerx
inused
staat, - evalueert tot
None
wanneerx
niet inused
is.
En in beide gevallen (False
/None
), wordt dit behandeld als falsy
waarde en krijgen we een lege lijst als een resultaat.
Maar waarom evalueert dit tot None
wanneer x
niet in used
is? Iemand kan het vragen.
Nou, het is omdat dit is hoe Python’s kort -circuit operators werken.
De uitdrukking
x and y
evalueert eerst x; als x onwaar is, is de waarde ervan
geretourneerd; anders wordt y geëvalueerd en is de resulterende waarde
teruggestuurd.
Dus wanneer x
niet in gebruik is (dwz wanneer het True
) is, wordt het volgende deel of de uitdrukking geëvalueerd ( used.append(x)
) en de waarde (None
) worden geretourneerd.
Maar dat is wat we willen om de unieke elementen uit een lijst met duplicaten te halen, we willen ze alleen .append
in een nieuwe lijst als we ze voor de eerste keer tegenkomen.
Dus we willen used.append(x)
alleen evalueren als x
niet in used
staat, misschien als er een manier is om deze None
waarde om te zetten in een truthy
waarde, komt het wel goed, toch?
Nou ja, en hier komt het tweede type short-circuit
operators om de hoek kijken.
De uitdrukking
x or y
evalueert eerst x; als x waar is, is de waarde ervan
geretourneerd; anders wordt y geëvalueerd en is de resulterende waarde
teruggestuurd.
We weten dat .append(x)
altijd falsy
zal zijn, dus als we er één or
naast hem toevoegen, zullen we krijg altijd het volgende deel. Daarom schrijven we:
x not in used and (used.append(x) or True)
zodat we evalueren used.append(x)
en als resultaat True
krijgen, alleen wanneer het eerste deel van de uitdrukking (x not in used)
is True
.
Vergelijkbare mode is te zien in de 2e benadering met de reduce
-methode.
(l.append(x) or l) if x not in l else l
#similar as the above, but maybe more readable
#we return l unchanged when x is in l
#we append x to l and return l when x is not in l
l if x in l else (l.append(x) or l)
waar we:
- Voeg
x
toe aanl
en retourneer diel
wanneerx
niet inl
. Dankzij deor
-instructie wordt.append
geëvalueerd en wordtl
daarna geretourneerd. - Retourneer
l
onaangeroerd wanneerx
zich inl
bevindt
Antwoord 4, autoriteit 8%
Een Python-lijst:
>>> a = ['a', 'b', 'c', 'd', 'b']
Om unieke items te krijgen, verandert u deze in een set (die u indien nodig weer in een lijst kunt omzetten):
>>> b = set(a)
>>> print(b)
{'b', 'c', 'd', 'a'}
Antwoord 5, autoriteit 8%
Wat voor type is uw uitvoervariabele?
Python sets zijn wat je nodig hebt. Declareer uitvoer als volgt:
output = set() # initialize an empty set
en je bent klaar om elementen toe te voegen met output.add(elem)
en er zeker van te zijn dat ze uniek zijn.
Waarschuwing: sets behouden NIET de oorspronkelijke volgorde van de lijst.
Antwoord 6, autoriteit 5%
Opties om duplicaten te verwijderen kunnen de volgende generieke gegevensstructuren omvatten:
- set: ongeordende, unieke elementen
- bestelde set: bestelde, unieke elementen
Hier is een samenvatting om snel een van beide in Python te krijgen.
Gegeven
from collections import OrderedDict
seq = [u"nowplaying", u"PBS", u"PBS", u"nowplaying", u"job", u"debate", u"thenandnow"]
Code
Optie 1 – Een set (ongeordend):
list(set(seq))
# ['thenandnow', 'PBS', 'debate', 'job', 'nowplaying']
Optie 2 – Python heeft geen bestelde sets, maar hier zijn enkele manieren om er een na te bootsen (invoeging besteld):
list(OrderedDict.fromkeys(seq))
# ['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']
list(dict.fromkeys(seq)) # py36
# ['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']
De laatste optie wordt aanbevolen bij gebruik van Python 3.6+. Bekijk meer details in deze post.
Opmerking: vermelde elementen moeten hashable zijn. Zie details over het laatste voorbeeld in deze blog plaatsen. Zie verder de post van R. Hettinger over dezelfde techniek; het ordebehoud is een uitbreiding van een van zijn vroege implementaties. Zie ook meer over totale bestelling.
Antwoord 7, autoriteit 4%
Orde handhaven:
# oneliners
# slow -> . --- 14.417 seconds ---
[x for i, x in enumerate(array) if x not in array[0:i]]
# fast -> . --- 0.0378 seconds ---
[x for i, x in enumerate(array) if array.index(x) == i]
# multiple lines
# fastest -> --- 0.012 seconds ---
uniq = []
[uniq.append(x) for x in array if x not in uniq]
uniq
Bestelling maakt niet uit:
# fastest-est -> --- 0.0035 seconds ---
list(set(array))
Antwoord 8, autoriteit 2%
Unieke elementen uit de lijst halen
mylist = [1,2,3,4,5,6,6,7,7,8,8,9,9,10]
Eenvoudige logica gebruiken uit sets – sets zijn een unieke lijst met items
mylist=list(set(mylist))
In [0]: mylist
Out[0]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Eenvoudige logica gebruiken
newList=[]
for i in mylist:
if i not in newList:
newList.append(i)
In [0]: mylist
Out[0]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Pop-methode gebruiken
->pop verwijdert het laatste of geïndexeerde item en toont dat aan de gebruiker. video
k=0
while k < len(mylist):
if mylist[k] in mylist[k+1:]:
mylist.pop(mylist[k])
else:
k=k+1
In [0]: mylist
Out[0]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Numpy gebruiken
import numpy as np
np.unique(mylist)
In [0]: mylist
Out[0]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Antwoord 9
Als je numpy gebruikt in je code (wat een goede keuze kan zijn voor grotere hoeveelheden gegevens), bekijk dan numpy.unique:
>>> import numpy as np
>>> wordsList = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
>>> np.unique(wordsList)
array([u'PBS', u'debate', u'job', u'nowplaying', u'thenandnow'],
dtype='<U10')
(http://docs.scipy.org/doc /numpy/reference/generated/numpy.unique.html)
Zoals je kunt zien, ondersteunt numpy niet alleen numerieke gegevens, maar zijn ook stringarrays mogelijk. Het resultaat is natuurlijk een numpy-array, maar dat maakt niet veel uit, omdat het zich nog steeds als een reeks gedraagt:
>>> for word in np.unique(wordsList):
... print word
...
PBS
debate
job
nowplaying
thenandnow
Als je echt een vanillepythonlijst terug wilt hebben, kun je list() altijd aanroepen.
Het resultaat wordt echter automatisch gesorteerd, zoals u kunt zien aan de hand van de bovenstaande codefragmenten. Bekijk numpy unique zonder sort als het behouden van de lijstvolgorde vereist is.
Antwoord 10
set – ongeordende verzameling unieke elementen. Lijst met elementen kan worden doorgegeven aan de constructor van de set. Dus geef een lijst door met dubbele elementen, we worden ingesteld met unieke elementen en transformeren deze terug naar een lijst en krijgen vervolgens een lijst met unieke elementen. Ik kan niets zeggen over prestaties en geheugenoverhead, maar ik hoop dat het niet zo belangrijk is met kleine lijsten.
list(set(my_not_unique_list))
Eenvoudig en kort.
Antwoord 11
Dezelfde volgorde unieke lijst met alleen een lijstcompressie.
> my_list = [1, 2, 1, 3, 2, 4, 3, 5, 4, 3, 2, 3, 1]
> unique_list = [
> e
> for i, e in enumerate(my_list)
> if my_list.index(e) == i
> ]
> unique_list
[1, 2, 3, 4, 5]
enumerates
geeft de index i
en element e
als een tuple
.
my_list.index
retourneert de eerste index van e
. Als de eerste index niet i
is, dan is de e
van de huidige iteratie niet de eerste e
in de lijst.
Bewerken
Ik moet er rekening mee houden dat dit qua prestaties geen goede manier is om het te doen. Dit is slechts een manier om dit te bereiken met alleen een lijstcompressie.
Antwoord 12
Als een bonus, Counter
is een eenvoudige manier om zowel de unieke waarden als het aantal voor elke waarde te krijgen:
from collections import Counter
l = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
c = Counter(l)
Antwoord 13
Door de basiseigenschap van Python Dictionary te gebruiken:
inp=[u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
d={i for i in inp}
print d
Uitvoer zal zijn:
set([u'nowplaying', u'job', u'debate', u'PBS', u'thenandnow'])
Antwoord 14
Ten eerste, het voorbeeld dat je gaf is geen geldige lijst.
example_list = [u'nowplaying',u'PBS', u'PBS', u'nowplaying', u'job', u'debate',u'thenandnow']
Stel dat bovenstaande de voorbeeldlijst is. Vervolgens kunt u het volgende recept gebruiken om het itertools-voorbeelddocument te geven dat de unieke waarden kan retourneren en de volgorde kan behouden zoals u lijkt te vereisen. De iterabele hier is de example_list
from itertools import ifilterfalse
def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
# unique_everseen('ABBCcAD', str.lower) --> A B C D
seen = set()
seen_add = seen.add
if key is None:
for element in ifilterfalse(seen.__contains__, iterable):
seen_add(element)
yield element
else:
for element in iterable:
k = key(element)
if k not in seen:
seen_add(k)
yield element
Antwoord 15
def get_distinct(original_list):
distinct_list = []
for each in original_list:
if each not in distinct_list:
distinct_list.append(each)
return distinct_list
Antwoord 16
set
kan u helpen de elementen uit de lijst te filteren die duplicaten zijn. Het werkt goed voor str
, int
of tuple
elementen, maar als uw lijst dict
of andere list
elementen, dan krijg je TypeError
uitzonderingen.
Hier is een algemene oplossing voor het bewaren van bestellingen voor sommige (niet alle) niet-hashbare typen:
def unique_elements(iterable):
seen = set()
result = []
for element in iterable:
hashed = element
if isinstance(element, dict):
hashed = tuple(sorted(element.iteritems()))
elif isinstance(element, list):
hashed = tuple(element)
if hashed not in seen:
result.append(element)
seen.add(hashed)
return result
Antwoord 17
Gebruik onderstaande code om unieke waarden uit uw lijst te krijgen:
trends = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
output = set(trends)
output = list(output)
BELANGRIJK:
Bovenstaande aanpak werkt niet als een van de items in een lijst niet hashable wat het geval is voor veranderlijke typen, bijvoorbeeld list of dict.
trends = [{'super':u'nowplaying'}, u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
output = set(trends)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Dat betekent dat je er zeker van moet zijn dat de trends
-lijst altijd alleen hashbare items bevat, anders moet je meer geavanceerde code gebruiken:
from copy import deepcopy
try:
trends = [{'super':u'nowplaying'}, [u'PBS',], [u'PBS',], u'nowplaying', u'job', u'debate', u'thenandnow', {'super':u'nowplaying'}]
output = set(trends)
output = list(output)
except TypeError:
trends_copy = deepcopy(trends)
while trends_copy:
trend = trends_copy.pop()
if trends_copy.count(trend) == 0:
output.append(trend)
print output
Antwoord 18
Als u unieke elementen uit een lijst wilt halen en hun oorspronkelijke volgorde wilt behouden, kunt u OrderedDict
gegevensstructuur uit de standaardbibliotheek van Python:
from collections import OrderedDict
def keep_unique(elements):
return list(OrderedDict.fromkeys(elements).keys())
elements = [2, 1, 4, 2, 1, 1, 5, 3, 1, 1]
required_output = [2, 1, 4, 5, 3]
assert keep_unique(elements) == required_output
Als je Python gebruikt? 3.6, daar kun je gewoon dict
voor gebruiken:
def keep_unique(elements):
return list(dict.fromkeys(elements).keys())
Het is mogelijk geworden na de introductie van “compacte” weergave van dictaten. Bekijk het hier. Hoewel dit “een implementatiedetail werd beschouwd en er niet op mag worden vertrouwd”.
Antwoord 19
Het verbaast me dat niemand tot nu toe een direct orderbehoudend antwoord heeft gegeven:
def unique(sequence):
"""Generate unique items from sequence in the order of first occurrence."""
seen = set()
for value in sequence:
if value in seen:
continue
seen.add(value)
yield value
Het genereert de waarden zodat het werkt met meer dan alleen lijsten, b.v. unique(range(10))
. Om een lijst te krijgen, roept u gewoon list(unique(sequence))
aan, zoals dit:
>>> list(unique([u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']))
[u'nowplaying', u'PBS', u'job', u'debate', u'thenandnow']
Het heeft de vereiste dat elk item hashable is en niet alleen vergelijkbaar, maar de meeste dingen in Python zijn en het is O(n) en niet O(n^2), dus werkt prima met een lange lijst.
Antwoord 20
Naast de vorige antwoorden, waarin staat dat je je lijst kunt converteren naar een set, kun je dat ook op deze manier doen
mylist = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenadnow']
mylist = [i for i in set(mylist)]
uitvoer zal zijn
[u'nowplaying', u'job', u'debate', u'PBS', u'thenadnow']
hoewel de volgorde niet behouden blijft.
Een ander eenvoudiger antwoord zou kunnen zijn (zonder sets te gebruiken)
>>> t = [v for i,v in enumerate(mylist) if mylist.index(v) == i]
[u'nowplaying', u'PBS', u'job', u'debate', u'thenadnow']
Antwoord 21
def setlist(lst=[]):
return list(set(lst))
Antwoord 22
Je kunt sets gebruiken. Voor de duidelijkheid, ik leg uit wat het verschil is tussen een lijst en een set.
sets zijn een ongeordende verzameling van unieke elementen. Lijsten zijn een geordende verzameling van elementen.
Dus,
unicode_list=[u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job',u'debate', u'thenandnow']
list_unique=list(set(unicode_list))
print list_unique
[u'nowplaying', u'job', u'debate', u'PBS', u'thenandnow']
Maar: gebruik list/set niet bij het benoemen van de variabelen. Het zal een fout veroorzaken:
EX: in plaats van lijst te gebruiken in plaats van unicode_list in de bovenstaande.
list=[u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job',u'debate', u'thenandnow']
list_unique=list(set(list))
print list_unique
list_unique=list(set(list))
TypeError: 'list' object is not callable
Antwoord 23
Set is een verzameling van ongeordende en unieke elementen. U kunt dus de onderstaande set gebruiken om een unieke lijst te krijgen:
unique_list = list(set([u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']))
Antwoord 24
- Verklaar aan het begin van uw code uw uitvoerlijst als leeg:
output=[]
- In plaats van uw code kunt u deze code gebruiken
trends=list(set(trends))
Antwoord 25
Mijn oplossing om de inhoud te controleren op uniciteit, maar de oorspronkelijke volgorde te behouden:
def getUnique(self):
notunique = self.readLines()
unique = []
for line in notunique: # Loop over content
append = True # Will be set to false if line matches existing line
for existing in unique:
if line == existing: # Line exists ? do not append and go to the next line
append = False
break # Already know file is unique, break loop
if append: unique.append(line) # Line not found? add to list
return unique
Bewerken:
Waarschijnlijk kan het efficiënter zijn door woordenboeksleutels te gebruiken om te controleren op het bestaan in plaats van een hele bestandslus voor elke regel te maken, ik zou mijn oplossing niet gebruiken voor grote sets.
Antwoord 26
gebruik set om een lijst te dedupliceren, terug te keren als lijst
def get_unique_list(lst):
if isinstance(lst,list):
return list(set(lst))
Antwoord 27
Ik weet dat dit een oude vraag is, maar hier is mijn unieke oplossing: klasse-overerving!:
class UniqueList(list):
def appendunique(self,item):
if item not in self:
self.append(item)
return True
return False
Als u items op een unieke manier aan een lijst wilt toevoegen, roept u appendunique op een UniqueList aan. Omdat het van een lijst erft, werkt het in feite als een lijst, dus je kunt functies gebruiken zoals index() enz. En omdat het waar of onwaar retourneert, kun je erachter komen of het toevoegen is geslaagd (uniek item) of mislukt (reeds in de lijst).
Om een unieke lijst met items uit een lijst te krijgen, gebruikt u een for-lus om items toe te voegen aan een UniqueList (kopieer vervolgens naar de lijst).
Voorbeeld gebruikscode:
unique = UniqueList()
for each in [1,2,2,3,3,4]:
if unique.appendunique(each):
print 'Uniquely appended ' + str(each)
else:
print 'Already contains ' + str(each)
Afdrukken:
Uniquely appended 1
Uniquely appended 2
Already contains 2
Uniquely appended 3
Already contains 3
Uniquely appended 4
Kopiëren naar lijst:
unique = UniqueList()
for each in [1,2,2,3,3,4]:
unique.appendunique(each)
newlist = unique[:]
print newlist
Afdrukken:
[1, 2, 3, 4]
Antwoord 28
Voor lange arrays
s = np.empty(len(var))
s[:] = np.nan
for x in set(var):
x_positions = np.where(var==x)
s[x_positions[0][0]]=x
sorted_var=s[~np.isnan(s)]
Antwoord 29
Probeer deze functie, het is vergelijkbaar met uw code, maar het is een dynamisch bereik.
def unique(a):
k=0
while k < len(a):
if a[k] in a[k+1:]:
a.pop(k)
else:
k=k+1
return a
Antwoord 30
Gebruik de volgende functie:
def uniquefy_list(input_list):
"""
This function takes a list as input and return a list containing only unique elements from the input list
"""
output_list=[]
for elm123 in input_list:
in_both_lists=0
for elm234 in output_list:
if elm123 == elm234:
in_both_lists=1
break
if in_both_lists == 0:
output_list.append(elm123)
return output_list