Seite 1 von 1

Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 14:26
von Bioaim
Hallo Leute,

ich habe ein Array, die Event Objekte enthalten. Ein Event besitzt eine TypeId (immer gleich), einen Namen und ein Datum.

In dem Array sind Duplikate vorhanden, die ich jetzt los werden will. Ich hab das ganze versucht in ein Set umzuwandeln, leider bleibe dabei aber die Duplikate vorhanden. (weil natürlich nicht der Inhalt des Arrays auf Gleichheit geprüft wird).

Mein Ansatz war dieser: (Pseudocode)

Code: Alles auswählen

for e, index in enumerate(events):
	for l, index2 in enumerate(events, start=index+1):
		if events[index].name == events[index2].name and events[index]date == events[index2].date 
Leider bekomm ich beim Durchsuchen des letzten Items vom Array einen IndexNotInRange Error, da ich ja den zweiten Index auf Index+1 setzte...

Was wäre also die richtige Art das ganze zu realisieren?

Danke für eure Antworten.

LG

Re: Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 14:37
von Sirius3
@Bioaim: der "Pseudocode" funktioniert schon allein deshalb nicht, weil Du bei enumerate Index und Element vertauscht hast. Zum anderen macht es nicht das, was Du willst.
Wenn Du wirklich nur TypeId Name und Datum hast, sollte ein Set funktionieren. Du mußt halt die Gleichheitsmethode __eq__ und __hash__ der Event-Objekte implementieren. Alternativ hilft hier ein Wörterbuch:

Code: Alles auswählen

unique_events = {}
for event in events:
    unique_events[event.name, event.date] = event

Re: Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 14:43
von BlackJack
@Bioaim: Array? Eventuell nicht doch eine Liste?

Das könnte man mit einem Wörterbuch lösen das Tupel von Name und Datum auf das Ereignisobjekt abbildet. Wenn Du so alle Objekte eingetragen hast, kannst Du die Werte von dem Wörterbuch abfragen und hast keine Duplikate mehr. Falls die Reihenfolge wichtig ist, dann hilft `collections.OrderedDict` eventuell. Falls das nicht die gewünschte Reihenfolge liefert, dann könnte man sich mit einem `set()` merken welche (Name, Datum)-Paare man schon gesehen hat und entsprechend das Element zum Ergebnis hinzufügen oder nicht.

Re: Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 14:50
von Bioaim
Hab vergessen zu erwähnen, dass ein Event noch weitere Attribute besitzt: LocationId, Subtitle, Genre, die aber alle nicht verwendent werden sollen, um Events auf Gleichheit zu prüfen.

Wie würden denn meine EQ und HASH Methoden aussehen, wenn ich prüfen will, ob Name und Datum gleich sind?

Bin normalerweise nicht mit Python unterwegs, sorry.

Re: Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 17:19
von Bioaim
Okay, hab das nun mit einem Wörterbuch probiert. Das ganze funktioniert, beinhaltet also keine Duplikate mehr. Das Problem dabei ist, dass ich jetzt nur noch den Namen und und das Datum habe, wie kann ich wieder auf alle Attribute zugreiffen?

Code: Alles auswählen

unique_events = {}
for event in events:
    unique_events[event.name, event.start_date] = event
    
return unique_events

Re: Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 17:26
von BlackJack
@Bioaim: Wieso hast Du nur noch die Tupel? Auf was hast Du die denn abgebildet? Oder weisst Du jetzt nur nicht wie Du an die Werte kommst? Da gibt es verschiedene Methoden für auf `dict`. Je nach dem wie man die gerne hätte (Liste, Iterator).

Re: Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 17:28
von Bioaim
Hab mich falsch ausgedrückt, wusste nur nicht, wie ich jetzt wieder an die Daten komme, habs aber geschafft :)

Code: Alles auswählen

for key, value in events:
	print events[key, value].name
Danke euch!

Re: Objekt Array, Duplikate löschen

Verfasst: Donnerstag 24. März 2016, 17:41
von snafu
Es wäre ganz einfach:

Code: Alles auswählen

for event in events.values():
    print(event.name)
Oder ohne explizite Schleife:

Code: Alles auswählen

from operator import attrgetter

map(attrgetter('name'), events.values())