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?

6voto

oliver smith Punkte 95
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

5voto

skovorodkin Punkte 7938

Wenn Sie eindeutige Elemente aus einer Liste erhalten und ihre ursprüngliche Reihenfolge beibehalten wollen, können Sie OrderedDict Datenstruktur aus der Standardbibliothek von 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

Wenn Sie Python 3.6 verwenden, können Sie sogar die einfache dict dafür:

def keep_unique(elements):
    return list(dict.fromkeys(elements).keys())

Dies ist seit der Einführung der "kompakten" Darstellung von Diktaten möglich geworden. Probieren Sie es aus aquí . Allerdings ist dies "ein Detail der Umsetzung und sollte nicht als verlässlich angesehen werden".

5voto

Ricky Wilson Punkte 2937
def setlist(lst=[]):
   return list(set(lst))

4voto

Andriy Ivaneyko Punkte 18213

Um eindeutige Werte von Ihr Liste verwenden Sie den unten stehenden Code:

trends = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
output = set(trends)
output = list(output)

WICHTIG! Der obige Ansatz funktioniert nicht, wenn eines der Elemente in einer Liste nicht Hashable was der Fall ist für änderbar Typen, zum Beispiel Liste o Diktat .

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'

Das bedeutet, dass Sie sicher sein müssen, dass trends Liste würde immer nur hashfähige Elemente enthalten, andernfalls müssten Sie einen komplexeren Code verwenden:

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

4voto

olau Punkte 93

Ich bin überrascht, dass bisher noch niemand eine direkte Antwort zur Erhaltung der Ordnung gegeben hat:

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

Er generiert die Werte so, dass er mit mehr als nur Listen arbeitet, z. B. unique(range(10)) . Um eine Liste zu erhalten, rufen Sie einfach an list(unique(sequence)) etwa so:

>>> 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']

Es hat die Anforderung, dass jedes Element hashable und nicht nur vergleichbar ist, aber die meisten Sachen in Python ist und es ist O(n) und nicht O(n^2), so wird gerade gut mit einer langen Liste arbeiten.

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