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

その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

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

サブリストの2番目の項目はそのタイムスタンプのカウントであると(おそらく間違って)想定しています。そうでない場合は、リストの長さを(NPEの回答のように)取得することが正しい方法です。


タイムスタンプはミリ秒単位であるように見えるため、7200ではなく7200000を使用することをお勧めします。

于 2012-12-18T21:58:48.957 に答える