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

如果 item 的长度为 6,则表示它是一个请求,否则它是一个响应,现在我需要将这个列表中的所有请求和响应配对,它们已经按时间排序,如您在此示例中所见,前两项都是请求。

我想一个一个地浏览这些项目,如果一个请求后面跟着一个响应,那么它们是一对,我会为它们分配一个编号。如果一个请求后面跟着一个请求,那么第一个请求应该被丢弃,并检查第二个请求后面是否有响应,等等

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

定义这个方法(source):

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--the last 迭代中的最后一项将是(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))

然后你可以参考itemaslist[index]next itemwill be list[index+1]

于 2012-06-10T14:40:23.230 回答