2017-05-03 4 views
-1

Ich benutze Python-Wörterbuch, um die Zeit zwischen zwei Ereignissen zu berechnen, aber basierend auf meinem Ansatz bin ich Ausgabe verdoppelt. Hier meine Eingangsdaten ist (man beachte die jüngsten, die erste Zeile wird nicht so kann nicht ber Zeit in ausgegeben werden, nachdem es keine andere Veranstaltung):Python verhindern doppelte Ausgaben aus dem Wörterbuch

user_id,unix_timestamp,product_id 
u_ab,149356478,p_4363423 
u_ab,149356453,p_4363455 
u_ab,149356422,p_4363456 

Ich nehme die Daten und erstellen Sie ein Wörterbuch hier von anderen Nutzern Aktivität:

context_sessions = {'u_ab': [['u_ab', '149356478', 'p_4363423'], ['u_ab', '149356453', 'p_4363455'], ['u_ab', '149356422', 'p_4363456']]} 

Hier ist mein Code:

 for key, value in context_sessions.items(): 
      num_pageviews = len(value) 
      if num_pageviews > 1: 
       for a in range(num_pageviews): 
        user_id = context_sessions[key][(a-1)][0] 
        view_time = context_sessions[key][(a-1)][1] 
        next_view_time = context_sessions[key][(a-2)][1] 
        product_id = context_sessions[key][(a-1)][2] 
        dwell_time = int(next_pageview_time) - int(pageview_time) 
        print(user_id, product_id, dwell_time) 

Hier ist der Ausgang (Hinweis wiederholt Werte):

u_ab, p_4363455, 25 
u_ab, p_4363455, 25 
u_ab, p_4363456, 10 
u_ab, p_4363455, 25 
+1

Überprüfen Sie Ihre Einrückung. Dies ist nicht gültig Python - die Dinge nach dem ersten 'für' sind auf der gleichen Einrückungsebene. –

+0

Auch Ihre context_sessions für 'u_ab' haben eindeutig nur 3 Einträge, was es sehr unwahrscheinlich macht, dass Ihr 'for a in range' (len (context_sessions '' '' ')') 4 mal ausgeführt wird. Außerdem erwarte ich, dass "next_pageview_time" und "pageview_time" jeweils als "next_view_time" und "view_time" gemeint sind. Ich stimme Aryamccarthy zu - das ist kein [McVE]. –

+0

Der von Ihnen gepostete Code wird nicht ausgeführt und liefert die von Ihnen angegebenen Ergebnisse. Daher habe ich diese Frage abgelehnt. Ihr Problem mit der Indizierung reicht jedoch aus, um auf das zu verweisen, was das meiste Ihres Problems ist, und es mag so weit verbreitet sein, dass es in Zukunft jemand anderen nutzen wird, also habe ich eine Antwort geschrieben. Wenn Sie Ihren Code hier aktualisieren, damit die Ausgabe tatsächlich mit Ihrer Eingabe übereinstimmt, vergewissern Sie sich, dass Sie einen Kommentar hinterlassen, und ich werde meinen Downvote entfernen. –

Antwort

0

Sie sollten Set und tuple verwenden, um eindeutige Werte

# declare empty set variable 
output = set([]) 

#......your code here ..... 
# replace print using following 2 line 
t = (user_id, product_id, dwell_time) 
output.add(t) 

# print the set 
print(list(output)) 
+0

-1. Im besten Fall wird dadurch das Problem maskiert, das zur Ausgabe von Duplikaten führt. Es wird nicht lösen, was auch immer das zugrunde liegende Problem ist. –

+0

ya, du hast recht, ich lese nur 'input' und' output' –

0

Lernen zu erhalten, wie durch den Code zu Schritt; Es ist eine der wichtigsten Fähigkeiten für einen frühen Entwickler zu lernen. Werkzeuge wie pdb können helfen, aber das können und sollten Sie zuerst mit Papier und Stift machen.

Lassen Sie uns bewerten, was in den Code passieren Sie auf dem Laufenden:

for key, value in context_sessions.items(): 

Gut. Basierend auf dem Detail, das Sie zeigt uns, wir an einem gewissen Punkt context_sessions['u_ab'] Auswertung sein werden

 num_pageviews = len(value) 
     if num_pageviews > 1: 
      for a in range(num_pageviews): 

Ok, dann ist dies, auch nicht schlecht. Im Fall von context_sessions['u_ab'] sollte dies uns num_pageviews = 3 geben, und das bedeutet a wird von 0 bis einschließlich 2 gehen.

   user_id = context_sessions[key][(a-1)][0] 
       view_time = context_sessions[key][(a-1)][1] 
       next_view_time = context_sessions[key][(a-2)][1] 
       product_id = context_sessions[key][(a-1)][2] 

Dies ist, wo die Dinge wirklich fraglich bekommen. Wenn a == 0, Sie dann den folgenden erhalten, (unter der Annahme, was Sie uns von context_sessions['u_ab'] zeigte korrekt):

user_id = context_sessions[key][-1][0] = 'u_ab' 
view_time = context_sessions[key][-1][1] = '149356422' 
next_view_time = context_sessions[key][-2][1] = '149356453' 
product_id = context_sessions[key][-1][2] = 'p_4363456' 

wenn a == 1:

user_id = context_sessions[key][0][0] = 'u_ab' 
view_time = context_sessions[key][0][1] = '149356478' 
next_view_time = context_sessions[key][-1][1] = '149356422' 
product_id = context_sessions[key][0][2] = 'p_4363423' 

und wenn ein == 2 :

user_id = context_sessions[key][1][0] = 'u_ab' 
view_time = context_sessions[key][1][1] = '149356453' 
next_view_time = context_sessions[key][0][1] = '149356478' 
product_id = context_sessions[key][1][2] = 'p_4363455' 

Und das ist die ganze Ausgabe, die Sie haben sollten, wenn Sie den genauen Code gepostet haben. Wenn Sie einen vierten Wert erhalten, geht das nicht von dieser Schleife aus, aber ich bin sicher, Sie können sehen, wie die Verwendung der ungültigen Bereiche Probleme verursacht, und dies ist wahrscheinlich die Ursache dafür, was passiert, wenn Sie mit den echten Daten arbeiten.

Beachten Sie, dass die Indizierung auf einer negativen Zahl nicht schlecht ist; list [-1] liefert das letzte Element in der Liste und list [-2] gibt das zweitletzte Element in der Liste zurück. In diesem Fall ist es jedoch nicht das gewünschte Verhalten.

Um dies zu lösen, ändern Sie die Art, wie Sie nach vorne schauen. Sie überprüfen bereits, dass die Länge größer als 1 sein sollte. Nutzen Sie dies auf die richtige Art und Weise:

Verwandte Themen