2

次のようなタプルのリストがあります。

[(time1, hashusi, servername, uri, referrer, useragent),
 (time2, hashusi, servername, uri, referrer, useragent),
 (time3, srcip, code, mime),
 (time4, hashusi, servername, uri, referrer, useragent),
 (time5, srcip, code, mime) ...]

アイテムの長さが6の場合、それはリクエストであることを意味します。それ以外の場合はレスポンスです。このリストのすべてのリクエストとレスポンスをペアにする必要があります。この例でわかるように、これらはすでに時間で並べ替えられています。最初の2つの項目は両方ともリクエストです。

一つずつ調べていきたいのですが、リクエストの後にレスポンスがあればペアになり、番号を付けていきます。リクエストの後にリクエストが続く場合は、最初のリクエストを破棄し、2番目のリクエストの後に応答が続くかどうかを確認する必要があります。

for item in mergelistsorted:
    if len(item) == 6 and flag == None: #The first item is a request
       ##need to check the next item##
       if len(next item) == 6:
          continue
       else:
          requestlist.append((item[0],item[1],item[2],item[3])) 

「次のアイテム」の参照方法がわかりません

4

3 に答える 3

4

このメソッドを定義します(ソース):

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

次に、このループを使用します。

for curr, next in pairwise(list):

これの注意点は、最後のアイテムを取得できないことです。curr最後の反復はになります(next_to_last, last)。最後のイテレーションに参加したい場合は、定義で(last, None)に変更する必要がありizipます。izip_longestpairwise

于 2012-06-10T14:45:04.287 に答える
2

次のようなループを使用して、ペアを反復処理できます。

for prv, nxt in zip(ls[:-1], ls[1:]):
   ...     

例えば:

ls = [
    'request1',
    'request2',
    'request3',
    'response3',
    'request4',
    'response4',
]

for prv, nxt in zip(ls[:-1], ls[1:]):
    if 'request' in prv and 'response' in nxt:
        print prv, nxt
于 2012-06-10T14:40:55.413 に答える
1

を使用する代わりに、をfor item in list使用してfor index in range(len(list))ください。

次に、を参照できitem、はlist[index]next itemなりますlist[index+1]

于 2012-06-10T14:40:23.230 に答える