Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用计算日期范围内发生次数的算法分析python列表_Python_Algorithm - Fatal编程技术网

使用计算日期范围内发生次数的算法分析python列表

使用计算日期范围内发生次数的算法分析python列表,python,algorithm,Python,Algorithm,下面显示了我拥有的一些数据格式的结构:列表列表 data = [ [1,2008-12-01], [1,2008-12-01], [2,2008-12-01] ... (the lists continue) ] 日期范围为2008-12-01至2008-12-25 第一个字段通过id标识用户,第二个字段是日期字段,该用户访问我的站点上的页面时显示 我需要分析这些数据,以便得到以下结果 1天内访问了25个用户 两天内访问了100名用户 4天内访问了300名用户 ... 最多

下面显示了我拥有的一些数据格式的结构:列表列表

data = 
[ 
  [1,2008-12-01],
  [1,2008-12-01],
  [2,2008-12-01]
  ... (the lists continue)
]
日期范围为2008-12-01至2008-12-25

第一个字段通过id标识用户,第二个字段是日期字段,该用户访问我的站点上的页面时显示

我需要分析这些数据,以便得到以下结果

1天内访问了25个用户 两天内访问了100名用户 4天内访问了300名用户 ... 最多25天

我正在使用python,不知道从哪里开始

编辑

很抱歉,我似乎对我需要的东西不够清楚,因为有几个人给出了我不想要的答案

我需要知道每天有多少用户访问过,例如。 25天或每天访问10个用户

然后,我想为1-25天的每个频率列出相同的。根据我上面的原始示例 25个用户中只有一天访问了25个 25天中有2天访问了100个用户 等

我不需要知道每天有多少人来访
谢谢你的结果是一本字典,对吗

{ userNumber: setOfDays }
这个怎么样,开始吧

from collections import defaultdict
visits = defaultdict(set)
for user, date in someList:
    visits[user].add(date)
这会给你一本字典,上面有他们访问的日期

counts = defaultdict(int)
for user in visits:
    v= len(visits[user])
    count[v] += 1
这就为你提供了一个访问量字典,一个访问量如此之多的用户字典


这就是您要查找的内容吗?

首先,我要提到的是,您需要将日期存储为字符串。目前,它会对您当前的条目进行算术运算。因此,如果您这样格式化数据,它将工作得更好:

data = 
[ 
  [1,"2008-12-01"],
  [1,"2008-12-01"],
  [2,"2008-12-01"]
]
接下来,我们可以这样做来获取每天的数字:

result = {}
for (id, date) in data:
    if date not in result:
        result[date] = 1
    else:
        result[date] += 1
现在,您可以通过执行以下操作获取特定日期的用户数:

print result[some_date]

不清楚您的具体要求是什么。以下是我的看法:

#!/usr/bin/env python
from collections import defaultdict

data = [ 
  [1,'2008-12-01'],
  [3,'2008-12-25'],
  [1,'2008-12-01'],
  [2,'2008-12-01'],
]

d = defaultdict(set)
for id, day in data:
    d[day].add(id)

for day in sorted(d):
    print('%d user(s) visited on %s' % (len(d[day]), day))
它打印:

2 user(s) visited on 2008-12-01
1 user(s) visited on 2008-12-25

这样如何:这将为您提供一组天数和计数:

In [39]: from itertools import groupby ##itertools is a part of the standard library.

In [40]: l=[[1, '2008-12-01'],
   ....:  [1, '2008-12-01'],
   ....:  [2, '2008-12-01'],
   ....:  [1, '2008-12-01'],
   ....:  [3, '3008-12-04']]

In [41]: l.sort()

In [42]: l
Out[42]: 
[[1, '2008-12-01'],
 [1, '2008-12-01'],
 [1, '2008-12-01'],
 [2, '2008-12-01'],
 [3, '3008-12-04']]

In [43]: for key, group in groupby(l, lambda x: x[0]):
   ....:     group=list(group)
   ....:     print key,' :: ', len(group), ' :: ', group
   ....:     
   ....:     
1  ::  3  ::  [[1, '2008-12-01'], [1, '2008-12-01'], [1, '2008-12-01']]
2  ::  1  ::  [[2, '2008-12-01']]
3  ::  1  ::  [[3, '3008-12-04']]
用户::访问次数::访问日期

在这里,用户-1在2008-12-01访问了3次,如果您希望只计算不同的日期,那么

for key, group in groupby(l, lambda x: x[0]):
    group=list(group)
    print key,' :: ', len(set([(lambda y: y[1])(each) for each  in group])), ' :: ', group
   ....:     
   ....:     
1  ::  1  ::  [[1, '2008-12-01'], [1, '2008-12-01'], [1, '2008-12-01']]
2  ::  1  ::  [[2, '2008-12-01']]
3  ::  1  ::  [[3, '3008-12-04']]

在SQL中重写S.Lott的答案作为练习,只是为了检查我是否正确地得到了需求

SELECT * FROM someList;

 userid |    date    
--------+------------
      1 | 2008-12-01
      1 | 2008-12-02
      1 | 2008-12-03
      1 | 2008-12-04
      1 | 2008-12-05
      2 | 2008-12-03
      2 | 2008-12-04
      2 | 2008-12-05
      3 | 2008-12-04
      4 | 2008-12-04
      5 | 2008-12-05
      5 | 2008-12-05

SELECT countdates, COUNT(userid) AS nusers
FROM ( SELECT userid, COUNT (DISTINCT date) AS countdates
             FROM someList
             GROUP BY userid ) AS visits
GROUP BY countdates
HAVING countdates <= 25
ORDER BY countdates;

 countdates | nusers 
------------+--------
          1 |      3
          3 |      1
          5 |      1

这可能不是最具python风格、最高效、最聪明的方式,或者其他任何方式。但也许您可以确认我是否正确理解了这些要求:

>>> log=[[1, '2008-12-01'], [1, '2008-12-01'],[2, '2008-12-01'],[2, '2008-12-03'], [1, '2008-12-04'], [3, '2008-12-04'], [4, '2008-12-04']]
>>> all_dates = sorted(set([d for d in [x[1] for x in log]]))
>>> for i in range(0, len(all_dates)):
...     log_slice = [d for d in log if d[1] <= all_dates[i]]
...     num_users = len(set([u for u in [x[0] for x in log_slice]]))
...     print "%d users visited in %d days" % (num_users, i + 1)
... 
2 users visited in 1 days
2 users visited in 2 days
4 users visited in 3 days
>>> 

您将第一个字典声明为“访问”,因此您的意思是:对于访问中的用户:visit=lenvisions[users]count[visit]+=1,甚至:对于访问中的访问。itervalues:count[lenvisit]+=1这应该使用collections.defaultdict,就像S.Lott的代码一样。它是一个简化这种字典添加的类。它给出了在给定日期访问的人数,因为您是按日期分组的。他想知道有多少人访问过x次。他需要按用户id分组,而不是按日期分组。你能清楚地把问题重写一遍吗。这是指“计算用户访问的不同天数”还是“25天中每天访问的不同用户数”??