Ich habe eine Liste von Leuten:
%Vor% Ich füge Gewinne mit einer Liste von Namen hinzu ( ['Fred', 'Mary', 'Sally']
). Ich weiß nicht, ob der Name schon in der Liste der Leute ist, und ich muss einen neuen Eintrag einfügen, wenn nicht. Momentan mache ich folgendes:
Gibt es einen besseren Weg, dies mit einer Liste zu tun? Da ich dies in MongoDB speichere, kann ich kein dict
verwenden, da es als Objekt gespeichert wird und ich native Array-Funktionen zum Sortieren und Zuordnen verwenden möchte, die für Objekte nicht verfügbar sind.
Ich gehe hier davon aus, dass Sie keine andere Struktur als die Liste verwenden wollen. Ihr Code sollte funktionieren, obwohl Sie das Wörterbuch nach der Aktualisierung unnötig in die Liste schreiben. Wörterbücher werden als Referenz kopiert. Sobald Sie sie aktualisieren, bleibt sie in der Liste aktualisiert. Nach ein wenig Haushalt könnte Ihr Code wie folgt aussehen:
%Vor%Wenn Sie ein Diktat nicht dauerhaft verwenden möchten, verwenden Sie es vorübergehend.
%Vor%Ihr Zugriffsmuster schreibt die Verwendung einer anderen Datenstruktur (oder zumindest einer anderen Hilfsdatenstruktur) vor. Die Liste zu scannen, wie Sie es tun, ist in der Tat das Richtige, wenn Sie eine Liste verwenden, aber Sie sollten keine Liste verwenden (wenn Sie möchten, dass sie trotzdem effizient ist).
Wenn die Reihenfolge der Liste keine Rolle spielt, sollten Sie ein Dictionary verwenden (python dict
). Wenn dies der Fall ist, sollten Sie OrderedDict
aus dem Modul collections
verwenden.
Sie können auch zwei separate Datenstrukturen verwenden - die Liste, die Sie bereits haben, und zusätzlich ein set
, das nur die Namen in der Liste enthält, so dass Sie schnell auf die Aufnahme zugreifen können oder nicht. Das set
hilft Ihnen jedoch nicht, schnell auf die eigentlichen Namensdaten zuzugreifen (Sie müssten dafür immer noch eine lineare Suche in der Liste durchführen). Es wäre also nur ein hilfreiches Muster, wenn Sie nur die Einschreibung testen würden. aber sonst immer die Liste laufen, wie es eingefügt wurde.
Bearbeiten : Es scheint, als ob Sie tatsächlich eine Liste und ein dict wünschen, wobei das Wörterbuch eine Zuordnung zwischen name
und dem Index in der Liste darstellt. Alternativ könnten Sie immer noch dict
oder OrderedDict
verwenden, sie aber als Array in Mongo einfügen, indem Sie dict.iteritems()
verwenden, um beim Einfügen ein Array (oder was wie ein Array zu Mongo aussehen würde) zu erstellen. Sie könnten verschiedene Mutatoren von zip
zu Dingen in itertools
verwenden, um die Objekte, die Sie in Ihrem resultierenden Array benötigen, dynamisch aufzubauen.
Dieser spezielle Fall wird vom Typ collections.Counter
implementiert. Zusammen mit Array-Generatoren ist dies ein Ausdruck:
Wenn Sie eine bestimmte Reihenfolge wünschen, ist sorted()
der einfachste Weg (verwendet auch einen einfachen Generator ()
, anstatt eines Array-Generators []
, da er temporär ist):
Wo item['name']
könnte item['wins']
oder ein anderer vergleichbarer Ausdruck sein.