如何表示列表python中的项目

时间:2012-06-10 14:36:37

标签: python

我有一个元组列表,如下所示:

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

我不知道如何参考“下一项”

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 itemlist[index+1]