1238 Stimmen

Eindeutige Werte aus einer Liste in Python abrufen

Ich möchte die eindeutigen Werte aus der folgenden Liste abrufen:

['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']

Die Ausgabe, die ich benötige, ist:

['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']

Dieser Code funktioniert:

output = []
for x in trends:
    if x not in output:
        output.append(x)
print(output)

Gibt es eine bessere Lösung, die ich verwenden sollte?

89voto

pylang Punkte 33775

Die Optionen zum Entfernen von Duplikaten können die folgenden generischen Datenstrukturen umfassen:

Hier finden Sie eine Zusammenfassung, wie Sie schnell zu einem der beiden in Python gelangen.

Gegeben

from collections import OrderedDict

seq = [u"nowplaying", u"PBS", u"PBS", u"nowplaying", u"job", u"debate", u"thenandnow"]

Code

Option 1 - A set (ungeordnet):

list(set(seq))
# ['thenandnow', 'PBS', 'debate', 'job', 'nowplaying']

Python hat keine geordneten Mengen, aber hier sind sie einige Möglichkeiten um eine nachzuahmen.

Option 2 - ein OrderedDict (Einfügung angeordnet):

list(OrderedDict.fromkeys(seq))
# ['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']

Option 3 - a dict (Einfügungsreihenfolge), Standard in Python 3.6+. Siehe mehr Details in diesem post :

list(dict.fromkeys(seq))
# ['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']

Hinweis: Die aufgeführten Elemente müssen Hashable . Einzelheiten zum letztgenannten Beispiel finden Sie in diesem Blogbeitrag . Siehe auch R. Hettinger's post auf der gleichen Technik; das ordnungserhaltende Diktat ist eine Erweiterung einer seiner frühen Implementierungen. Siehe auch mehr über Gesamtbestellung .

57voto

daino3 Punkte 4014

Aufrechterhaltung der Ordnung:

# 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

Die Reihenfolge spielt keine Rolle:

# fastest-est -> --- 0.0035 seconds ---
list(set(array))

23voto

s_mj Punkte 474

Eindeutige Elemente aus der Liste holen

mylist = [1,2,3,4,5,6,6,7,7,8,8,9,9,10]

Einfache Logik aus Mengen verwenden - Mengen sind eindeutige Listen von Elementen

mylist=list(set(mylist))

In [0]: mylist
Out[0]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Einfache Logik verwenden

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]

U ->pop entfernt das letzte oder indizierte Element und zeigt es dem Benutzer an. 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 verwenden

import numpy as np
np.unique(mylist)

In [0]: mylist
Out[0]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Referenz

17voto

maclav3 Punkte 171

Wenn Sie numpy in Ihrem Code verwenden (was für größere Datenmengen eine gute Wahl sein könnte), sehen Sie sich 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 )

Wie Sie sehen können, unterstützt numpy nicht nur numerische Daten, auch String-Arrays sind möglich. Natürlich ist das Ergebnis ein Numpy-Array, aber das macht nicht viel aus, denn es verhält sich immer noch wie eine Sequenz:

>>> for word in np.unique(wordsList):
...     print word
... 
PBS
debate
job
nowplaying
thenandnow

Wenn Sie wirklich eine vanilla python Liste zurück haben wollen, können Sie immer list() aufrufen.

Das Ergebnis wird jedoch automatisch sortiert, wie Sie aus den obigen Codefragmenten ersehen können. Prüfen Sie numpy unique ohne Sortierung wenn die Reihenfolge der Liste beibehalten werden soll.

17voto

MultiTeemer Punkte 375

Set - ungeordnete Sammlung von eindeutigen Elementen. Eine Liste von Elementen kann an den Konstruktor von set übergeben werden. Übergeben Sie also eine Liste mit doppelten Elementen, erhalten Sie eine Menge mit eindeutigen Elementen und wandeln Sie sie zurück in eine Liste, um eine Liste mit eindeutigen Elementen zu erhalten. Ich kann nichts über die Leistung und den Speicher-Overhead sagen, aber ich hoffe, das ist bei kleinen Listen nicht so wichtig.

list(set(my_not_unique_list))

Einfach und kurz.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X