开发者

How to get the previous element when using a for loop? [duplicate]

This question already has answers here: Closed 12 years ago.

Possible Duplicates:

Python - Previous and next values inside a loop

python for loop, how to find next value(object)?

I've got a list that contains a lot of elements, I iterate over the list using a for loop开发者_JAVA技巧. For example:

li = [2, 31, 321, 41, 3423, 4, 234, 24, 32, 42, 3, 24, 31, 123]

for i in li:
    print(i)

But I want to get the element before i. How can I achieve that?


You can use zip:

for previous, current in zip(li, li[1:]):
    print(previous, current)

or, if you need to do something a little fancier, because creating a list or taking a slice of li would be inefficient, use the pairwise recipe from itertools

import itertools

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

for a, b in pairwise(li):
    print(a, b)


Normally, you use enumerate() or range() to go through the elements. Here's an alternative using zip()

>>> li = [2, 31, 321, 41, 3423, 4, 234, 24, 32, 42, 3, 24, 31, 123]
>>> list(zip(li[1:], li))
[(31, 2), (321, 31), (41, 321), (3423, 41), (4, 3423), (234, 4), (24, 234), (32, 24), (42, 32), (3, 42), (24, 3), (31, 24), (123, 31)]

the 2nd element of each tuple is the previous element of the list.


Just keep track of index using enumerate and get the previous item by index

li = list(range(10))

for i, item in enumerate(li):
    if i > 0:
        print(item, li[i-1])

print("or...")

for i in range(1, len(li)):
    print li[i], li[i-1]

Output:

1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
or...
1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8

Another alternative is to remember the last item, e.g.

last_item = None
for item in li:
    print(last_item, item)
    last_item = item


Simply keep track of the previous value using a separate variable.

j = None
for i in li:
    print(j)
    j = i


An option using the itertools recipe from here:

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

for i, j in pairwise(li):
    print(i, j)


Use a loop counter as an index. (Be sure to start at 1 so you stay in range.)

for i in range(1, len(li)):
  print(li[i], li[i-1])


li = [2,31,321,41,3423,4,234,24,32,42,3,24,,31,123]

counter = 0
for l in li:
    print l
    print li[counter-1] #Will return last element in list during first iteration as martineau points out.
    counter+=1
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜