我正在使用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
答案 0 :(得分:0)
您应该使用Set
和tuple
来获取唯一值
# 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)