2017-07-29 1 views
0

Für ein Kleinanzeigen Django Website-Projekt, habe ich eine Liste von Tupeln, bestehend aus (user_id, ad_id) Paare. Dies bezeichnet die user_id des Clickers zusammen mit dem entsprechenden ad_id.Berechnung der Häufigkeit von eindeutigen Tupeln in einer Liste von Tupeln

Zum Beispiel:

gross_clicks = [(1, 13),(1, 12), (1, 13), (2, 45), (2, 13), (1, 15), ...(n, m)] 

Die Elemente in dieser Liste sind keineswegs einzigartig - jeder Klick in diese Liste geschoben wird, unabhängig davon, ob es sich um den gleichen Benutzer und/oder es ist auf derselben Anzeige.

Jetzt kann ich alle eindeutigen Klicks erhalten, indem Sie:

unique_clicks = [] 
import operator 
gross_click_ids = map(operator.itemgetter(0), gross_clicks) 
return len(set(gross_click_ids)) 

Aber wie bekomme ich eindeutige Klicks pro Anzeige? I.e. Wenn derselbe Nutzer auf zwei verschiedene Anzeigen klickt, wird dies als 2 separate Klicks gezählt.

Leistung ist auch wichtig - es ist ein großer Datensatz - würde also die effizienteste Lösung bevorzugen, zusammen mit einem anschaulichen Beispiel.

+2

Anstatt dies in Python zu tun, warum nicht auf Datenbankebene? Dies wird wahrscheinlich schneller sein. –

+0

Ich dachte das Gleiche. Es wird auch einfacher sein. –

+0

@WillemVanOnsem: mein Backend ist 'Redis' –

Antwort

0

Nehmen Sie einfach einzigartige Tupeln:

unique_clicks = set(gross_clicks) 

Dies Sie den Satz von eindeutigen Benutzerzugriffe pro Anzeige gibt.

In Ihrem Abtastwerteingang erscheint (1, 13) zweimal, aber in einem Satz wäre es nur einmal erscheinen:

>>> gross_clicks = [(1, 13), (1, 12), (1, 13), (2, 45), (2, 13), (1, 15)] 
>>> set(gross_clicks) 
{(1, 12), (1, 13), (1, 15), (2, 45), (2, 13)} 

Sets Unter Einsatz einzigartige Elemente zu verfolgen ist so effizient, wie es eine große Liste von Tupeln erzielen kann, als Eingabe (Testen, ob ein gegebenes Tupel bereits in der Menge ist, ist eine O (1) konstante Zeitoperation).

Wenn diese Daten jedoch aus Ihrer Datenbank stammen, ist es effizienter, es zu fragen, Ihnen stattdessen eindeutige Paare zu geben.

0

Verwenden Sie stattdessen die distinct-Methode für das Abfrage-Set. Lassen Sie uns sagen, Ihr Modell ist User und Sie möchten einzigartige user_id, ad_id Paare erhalten.

User.objects.all().values_list('id', 'ad_id').distinct('id', 'ad_id') 

Dies führt die Arbeit auf der Datenbank-Ebene, also erwarte ich es wäre schneller als in Python wie Willem erwähnt.

I kann Ihre Frage missverstanden haben. Bitte lassen Sie mich wissen, wenn das der Fall ist, so kann ich versuchen, eine alternative Lösung zu bieten.