Python - 麻烦迭代嵌套列表

时间:2012-12-18 21:47:05

标签: python algorithm list data-structures iterator

我正试图通过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中缺乏理解,这都变得容易出错并且比应该更加困难。

感谢任何帮助和指导。

2 个答案:

答案 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,因为它显示您的时间戳以毫秒为单位。