2017-05-03 106 views
-1

我正在使用python字典來計算髮生兩個事件之間的時間,但是基於我的方法我得到的輸出重複。這裏是我的輸入數據(注意最近,第一行不會在輸出後不能計算時間,因爲沒有其他事件):Python防止字典重複輸出

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

我拿數據,並創建一個字典這裏由用戶活性:

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

這是我的代碼:

 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) 

這裏是輸出(通知重複的值):

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

仔細檢查您的縮進。這不是有效的Python-第一個'for'之後的東西在相同的縮進級別。 –

+0

另外,'u_ab'的context_sessions顯然只有3個條目,這使得你的'for範圍(len(context_sessions ['u_ab']))'執行4次的可能性很小。另外,我預計'next_pageview_time'和'pageview_time'分別是'next_view_time'和'view_time'。我同意aryamccarthy--這不是[mcve]。 –

+0

您發佈的代碼將不會運行並生成您指示的結果。因此,我已經投下了這個問題。但是,索引編制的問題足以指出您的大部分問題,並且可能已經足夠普遍,它會在未來讓其他人受益,所以我發佈了一個答案。如果你在這裏更新你的代碼,以便輸出實際上符合你的輸入,請確保留下評論,我將刪除我的downvote。 –

回答

0

您應該使用Settuple獲得唯一值

# 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。充其量,這將掩蓋導致重複輸出的問題。它不會解決任何潛在的問題。 –

+0

你說得對,我只讀了'input'和'output' –

0

瞭解如何通過代碼步驟;這是早期開發人員學習最重要的技能之一。像pdb這樣的工具可以提供幫助,但這是你可以並且應該先用紙和鉛筆做的事情。

讓我們評估您發佈的代碼中會發生什麼:

for key, value in context_sessions.items(): 

好。根據您向我們展示了一個細節,我們會在某個時候被評估context_sessions['u_ab']

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

好吧,這是不壞,要麼。在context_sessions['u_ab']的情況下,這應該給我們num_pageviews = 3,這意味着a將從0到2(含)。

   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] 

這就是事情實在令人質疑。當a == 0,你再得到如下,(假設你向我們展示的context_sessions['u_ab']是準確的):

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' 

當== 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' 

而當== 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' 

而這一切,你應該有,如果您發佈的準確代碼的輸出。如果你獲得第四個值,這不是來自這個循環,但我相信你可以看到使用無效範圍是如何引起問題的,這可能是當你使用真實數據運行時發生的情況的原因。

請注意,對負數進行索引並不差;列表[-1]返回列表中的最後一個項目,列表[-2]返回列表中最後一個項目的第二個項目。但在這種情況下,它肯定不是你想要的行爲。

要解決這個問題,請改變展望的方式。您已經檢查長度應該大於1.利用正確的方法:

for a in range(1, num_pageviews): 
    user_id = value[a][0] 
    view_time = value[a][1] 
    next_view_time = value[a-1][0] 
    product_id = value[a][2] 
    dwell_time = int(next_view_time) - int(view_time)