Python findet Objekt in einer Liste

8

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:

%Vor%

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.

    
Josh K 25.02.2011, 17:16
quelle

5 Antworten

11

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%     
DzinX 25.02.2011, 17:27
quelle
8

Ja, benutze ein Diktat.

%Vor%

bearbeiten:

%Vor%     
tangentstorm 25.02.2011 17:21
quelle
5

Wenn Sie ein Diktat nicht dauerhaft verwenden möchten, verwenden Sie es vorübergehend.

%Vor%     
Stephen Paulger 25.02.2011 17:33
quelle
3

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.

    
Nick Bastin 25.02.2011 17:22
quelle
0

Dieser spezielle Fall wird vom Typ collections.Counter implementiert. Zusammen mit Array-Generatoren ist dies ein Ausdruck:

%Vor%

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):

%Vor%

Wo item['name'] könnte item['wins'] oder ein anderer vergleichbarer Ausdruck sein.

    
Simon Buchan 12.07.2011 02:35
quelle

Tags und Links