2017-05-03 93 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)