3

我正在尝试通过 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

这样做的目标是遍历“列表”并添加所有在 2 小时范围内的条目。因此,如果开始为 0,则计算 0 到 7200 之间的每个条目,然后计算 7200 和 14200 之间的每个条目,等等。

理想情况下,我希望 newList 类似于:

[0][12]
[7200][11]

[the time stamp][the count]

无论出于何种原因,我在其他语言中的坏习惯以及我对 python 的理解不足,这变得容易出错并且比应有的方式更加困难。

任何帮助和指导表示赞赏。

4

2 回答 2

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)]

有什么办法可以让这个包含 0 的 7200 时间组?因此,如果我有一个 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

于 2012-12-18T21:53:53.570 回答
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,因为您的时间戳似乎以毫秒为单位。

于 2012-12-18T21:58:48.957 回答