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?

13voto

OdraEncoded Punkte 2877

Gleiche Reihenfolge eindeutige Liste mit nur einer Listenkompression.

> 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 ergibt den Index i und Element e als tuple .

my_list.index gibt den ersten Index von e . Wenn der erste Index nicht i dann ist die aktuelle Iteration der e ist nicht der erste e in der Liste.

Editar

Ich sollte anmerken, dass dies kein guter Weg ist, um dies zu tun, was die Leistung angeht. Dies ist nur einen Weg, der dies nur durch eine Listenkomprimierung erreicht.

7voto

Senthil Kumaran Punkte 50813

Erstens: Das von Ihnen angeführte Beispiel ist keine gültige Liste.

example_list = [u'nowplaying',u'PBS', u'PBS', u'nowplaying', u'job', u'debate',u'thenandnow']

Angenommen, die obige Liste ist ein Beispiel. Dann können Sie das folgende Rezept verwenden, wie es in der itertools-Beispieldokumentation angegeben ist, das die eindeutigen Werte zurückgibt und die Reihenfolge beibehält, die Sie zu benötigen scheinen. Die iterable hier ist die 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

7voto

SKY Punkte 175

Durch die Verwendung der grundlegenden Eigenschaft von Python Dictionary:

inp=[u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
d={i for i in inp}
print d

Die Ausgabe wird sein:

set([u'nowplaying', u'job', u'debate', u'PBS', u'thenandnow'])

7voto

Berislav Lopac Punkte 15229

Als Bonus, Counter ist ein einfacher Weg, um sowohl die eindeutigen Werte als auch die Anzahl für jeden Wert zu erhalten:

from collections import Counter
l = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow']
c = Counter(l)

6voto

Régis B. Punkte 9322

set kann Ihnen helfen, die Elemente aus der Liste herauszufiltern, bei denen es sich um Duplikate handelt. Es funktioniert gut für str , int o tuple Elemente, aber wenn Ihre Liste enthält dict oder andere list Elemente, so erhalten Sie am Ende TypeError Ausnahmen.

Hier ist eine allgemeine ordnungserhaltende Lösung, um einige (nicht alle) nicht-verrechenbare Typen zu behandeln:

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

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