我正试图通过python中的一些列表迭代来强制执行(我是一个pynoob),我似乎无法理解为什么这是一个问题。
我的数据结构如下:
pprint.pprint(list)
[[1355759452000L, 1],
[1355759191000L, 1],
[1355758983000L, 1],
[1355758939000L, 1],
... items removed for brevity...
[1355742844000L, 1],
[1355742833000L, 1],
[1355742558000L, 1]]
我想迭代这个列表,但是,我能够从中获取时间戳的唯一方法是执行以下操作(似乎错误):
startEpoch = 0
endEpoch = ...some future date...
newList = []
while currentTime <= endEpoch:
for i,l in enumerate(list):
for epoch in enumerate(l):
if epoch[1] >= currentTime and epoch[1] <= (currentTime + 7200):
newList.append(currentTime)
currentTime += 7200
这样做的目的是迭代'list'并添加一个落在2小时范围内的条目。因此,如果开始为0,则计算0到7200之间的每个条目,然后计算7200和14200之间的每个条目等。
理想情况下,我希望newList类似于:
[0][12]
[7200][11]
[the time stamp][the count]
无论出于何种原因,我在其他语言中的坏习惯以及我在python中缺乏理解,这都变得容易出错并且比应该更加困难。
感谢任何帮助和指导。
答案 0 :(得分:2)
这样的事情怎么样:
In [17]: l = [[0, 1], [3, 1], [200, 1], [8000, 1], [9000, 1], [20000, 1]]
In [24]: [(k,len(list(g))) for k,g in itertools.groupby(l, lambda x:x[0]-x[0]%7200)]
Out[24]: [(0, 3), (7200, 2), (14400, 1)]
这假定时间戳按时间顺序排列。如果不是,您可以使用collections.Counter
:
In [26]: sorted(collections.Counter(x[0]-x[0]%7200 for x in l).items())
Out[26]: [(0, 3), (7200, 2), (14400, 1)]
有没有办法让这个7200时间组包含0?因此,如果我的时间段为7200且原始列表中没有匹配的条目,我可以将其置零。 (我正在绘制这些数据)
In [29]: c = collections.Counter(x[0]-x[0]%7200 for x in l)
In [30]: [(t, c.get(t, 0)) for t in range(0, 72000, 7200)]
Out[30]:
[(0, 3),
(7200, 2),
(14400, 1),
(21600, 0),
(28800, 0),
(36000, 0),
(43200, 0),
(50400, 0),
(57600, 0),
(64800, 0)]
在这里,t
遍历您想要绘制的时间戳;如果有数据,c.get(t, 0)
会获取计数,如果没有数据,则会返回0
。
答案 1 :(得分:1)
与NPE的回答类似,
for k, g in itertools.groupby(items, lambda x: x[0] / 7200000):
print k,
print sum([x[1] for x in g])
我假设(可能不正确)子列表中的第二项是该时间戳的计数。如果没有,那么获取列表的长度(如在NPE的答案中)是正确的方法。
注意强>
您可能希望使用7200000而不是7200,因为它显示您的时间戳以毫秒为单位。