Python防止字典重复输出

时间:2017-05-03 15:22:58

标签: python dictionary

我正在使用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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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(包括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'

当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'

当a == 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'

如果您发布了准确的代码,那就是您应该拥有的所有输出。如果你得到第四个值,那么它不是来自这个循环,但我确信你可以看到使用无效范围是如何导致问题的,这可能是你运行真实数据时会发生什么的原因。

请注意,对负数进行索引并不错; list [-1]返回列表中的最后一项,list [-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)