2016-05-14 23 views
3

Ich versuche, einfacheren Code zum Hinzufügen von eindeutigen Elementen in eine Python-Liste zu schreiben. Ich habe ein Dataset, das eine Liste von Wörterbüchern enthält, und ich versuche, eine Liste innerhalb des Wörterbuchs zu durchlaufenPython Liste Verständnis: Hinzufügen von einzigartigen Elementen in der Liste?

Warum funktioniert das nicht? Es fügt alle Elemente, einschließlich der Duplikate, hinzu, anstatt eindeutige Elemente hinzuzufügen.

unique_items = [] 
unique_items = [item for d in data for item in d['items'] if item not in unique_items] 

gegen die längere Form, die funktioniert:

unique_items = [] 
for d in data: 
    for item in d['items']: 
     if (item not in unique_items): 
      unique_items.append(item) 

Gibt es eine Möglichkeit, diese Arbeit zu machen Liste Verständnis, oder bin ich stecken mit for-Schleifen Doppel mit? Ich möchte die Bestellung dafür behalten.

Hier ist die Liste der Wörterbücher:

[{"items":["apple", "banana"]}, {"items":["banana", "strawberry"]}, {"items":["blueberry", "kiwi", "apple"]}] 

Ausgabe sollte [ "Apfel", "Banane", "Erdbeere", "Blaubeere", "Kiwi"] werden

Ich bemerkte jemand ein gefragt ähnliche Frage auf einem anderen Beitrag: Python list comprehension, with unique items, aber ich frage mich, ob es eine andere Möglichkeit ist, es ohne OrderedDict zu tun, oder wenn das der beste Weg ist

+0

Bitte geben Sie weitere Informationen an: Ihre Liste von Diktaten wäre für jeden, der Hilfe anbietet, von großem Nutzen. – Abdou

+0

Verwenden Sie ein Set besser, es erhalten Rip aller Duplikate für Sie – Copperfield

+0

Möchten Sie die Bestellung behalten? – niemmi

Antwort

1

Der einfachste Weg ist OrderedDict zu verwenden:

from collections import OrderedDict 
from itertools import chain 

l = [{"items":["apple", "banana"]}, {"items":["banana", "strawberry"]}, {"items":["blueberry", "kiwi", "apple"]}] 
OrderedDict.fromkeys(chain.from_iterable(d['items'] for d in l)).keys() # ['apple', 'banana', 'strawberry', 'blueberry', 'kiwi'] 

Wenn Sie Alternativen OrderedSetrecipe und package überprüfen basierend auf es wollen.

+0

Dies funktionierte für mich. Vielen Dank! – user3226932

1

Warum nicht einfach set verwenden?

z.B. -

>>> data = {1: {'items': [1, 2, 3, 4, 5]}, 2: {'items': [1, 2, 3, 4, 5]}} 
>>> {val for item in data for val in data[item]['items']} 
>>> {1, 2, 3, 4, 5} 

Wenn Sie eine Liste möchten:

>>> list(repeat above) 
>>> [1, 2, 3, 4, 5] 

Anstelle der geschweiften Klammern {} für den Satz könnte man auch nur verwenden, um die set Schlüsselwort, da die Klammern für einige allzu dunkel sein kann.

Hier ist ein Link auf die syntax

+0

Es könnte sich lohnen, darauf hinzuweisen, dass die Reihenfolge nicht beibehalten wird, wie der betreffende Beispielcode oder die Antwort auf http://stackoverflow.com/questions/12681753/python-list-comprehension-with-unique-items – niemmi

1

all_items nicht kontinuierlich während der Liste Verständnis überschrieben, so dass Sie ständig Dinge in eine leere Liste suchen.

Ich würde dies tun, anstatt:

data = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, 3, 4,] 

items = [] 
_ = [items.append(d) for d in data if d not in items] 
print(items) 

und ich bekomme:

[1, 2, 3, 4, 5, 6] 

Aber es gibt effizientere Möglichkeiten, dies trotzdem zu tun.

+0

Was? sind einige effizientere Möglichkeiten, dies zu tun? – user3226932

+0

'set' wie in der anderen Antwort,' numpy.unique', etc –

Verwandte Themen