Preys
Preys

Reputation: 121

making list in python

When i executed the following python script

list= (1,2,3,4,1,2,7,8)

for number in list:
    item1= number
    item2= list[list.index(item1)+2]
    couple= item1, item2
    print couple

the goal is to link each number with the second following I obtain this result

(1, 3)
(2, 4)
(3, 1)
(4, 2)
(1, 3)
(2, 4)

(and then the index gets out of range but this is not the problem)

My question is why the number 1 in the fifth line is still coupled to the number 3 and how can i make that it is coupled to the number 7; idem for the number 2 in the sixth line that should be coupled to the number 8.

additional question what do I do if i only want to make a list of the couples that start with 1: [(1,3), (1,7)]

Upvotes: 0

Views: 830

Answers (5)

Hugh Bothwell
Hugh Bothwell

Reputation: 56714

list.index returns the offset of the first occurrence of the value in the list - thus if you do [1,1,1].index(1), the answer will always be 0, even though 1 and 2 are also valid answers.

Instead, try:

from itertools import islice, izip, ifilter

mylist = [1,2,3,4,1,2,7,8]
for pair in ifilter(lambda x: x[0]==1, izip(mylist, islice(mylist, 2, None))):
    print pair

results in

(1, 3)
(1, 7)

Upvotes: 3

tokland
tokland

Reputation: 67910

>>> zip(lst, lst[2:])
[(1, 3), (2, 4), (3, 1), (4, 2), (1, 7), (2, 8)]

To get only pairs (1, X):

>>> [(a, b) for (a, b) in zip(lst, lst[2:]) if a == 1]
[(1, 3), (1, 7)]

Recommended reading:

http://docs.python.org/tutorial/datastructures.html

http://docs.python.org/howto/functional.html

Upvotes: 0

John
John

Reputation: 5635

You have duplicates in the list so index always returns the first index.

Start your program with for index in range(len(list) - 1)

Upvotes: 1

user395760
user395760

Reputation:

xs.index(x) gives you the index of the first occurence of x in xs. So when you get to the second 1, .index gives you the index of the first 1.

If you need the index alongside the value, use enumerate: for i, number in enumerate(numbers): print number, numbers[i+2].

Note that I deliberately didn't use the name list. It's the name of a built-in, you shouldn't overwrite it. Also note that (..., ...) is a tuple (and therefore can't be changed), not a list (which is defined in square brackets [..., ...] and can be changed).

Upvotes: 1

amccormack
amccormack

Reputation: 13927

You are using .index which returns the first occurrence of number.

consider:

for number in range(len(list)):
    item1= list[number]
    item2= list[number+2]
    couple= item1, item2
    print couple

Upvotes: 0

Related Questions