我有一个元组列表,如下所示:
[(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,则表示它是一个请求,否则它是一个响应,现在我需要将此列表中的所有请求和响应配对,它们已按时间排序,如您所见在这个例子中,前两个项都是请求。
我想逐个浏览这些项目,如果请求后跟一个响应,那么它们就是一对,我会为它们分配一个数字。如果请求之后是请求,则应丢弃第一个请求,并检查第二个请求后面是否有响应等。
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]))
我不知道如何参考“下一项”
答案 0 :(得分: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
中的最后一项 - 最后一次迭代将是(next_to_last, last)
。如果您希望在最后一次迭代中获得(last, None)
,则需要在izip
定义中将izip_longest
更改为pairwise
。
答案 1 :(得分: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
答案 2 :(得分:1)
不使用for item in list
,而是使用for index in range(len(list))
。
然后,您可以将item
称为list[index]
,next item
将list[index+1]
。