Sree Harsha KOLI
Sree Harsha KOLI

Reputation: 23

How to pass an element in list as an index to a list in python?

Given a sorted list [1,2,3,4,5,6,7,8] and a shuffled version of that list

a=[1,2,5,3,7,8,6,4]

I want to find how many steps each element has moved from its position relative to the sorted list (steps towards index 0 being positive, steps away from index 0 being negative) and store those step values in the respective index in a different list.

For the given input, the expected output is:

b=[0,0,-1,-4,2,-1,2,2]

Considering the value 3 (which is at index 2 in the sorted list), in the shuffled array it is at index 3, so it has taken -1 step, and hence b[2] = -1. Similarly for the value 8 (which is at index 7 in the sorted list), in the shuffled array it is at index 5, so it has taken +2 steps, and hence b[7] = 2.

This is what I have tried:

b=[0,0,0,0,0,0,0,0]
a=[1,2,5,3,7,8,6,4]
for x in range(len(a)):
   b[a[x]]=a[x]-(x+1)

I am getting an error with this code:

IndexError: list assignment index out of range

Please help me understand this. Why can't I pass an integer from a list as an index to another list?

Upvotes: 2

Views: 1383

Answers (4)

Pynchia
Pynchia

Reputation: 11586

Avoiding any indexing, nor unnecessary offsets, we can store the elements in a dictionary (the element as the key and its move as the value)

a=[1,2,5,3,7,8,6,4]

d = {v: v-e for e,v in enumerate(a, 1)}
b = [v for _, v in sorted(d.items())]
print(b)

produces

[0, 0, -1, -4, 2, -1, 2, 2]

Upvotes: 1

TekHawk101
TekHawk101

Reputation: 44

Index starts from 0 to n-1 ,so in b=[0,0,0,0,0,0,0,0] (having 8 elements) index will start from 0 to 7 and list 'a=[1,2,5,3,7,8,6,4]' contains numbers from 1-8 hence 8 is out of index.

corrected code:

b=[0,0,0,0,0,0,0,0]
a=[1,2,5,3,7,8,6,4]
for x in range(len(a)):
   b[a[x] - 1]=a[x]-(x + 1)

Upvotes: 1

Nick
Nick

Reputation: 147206

You can get the result you want with a simple comparison of the expected value at an array position with the index of that value in the a array. By iterating over the number of elements in a, we can generate the output array:

a = [1,2,5,3,7,8,6,4]
b = []
for x in range(len(a)):
    b.append(x - a.index(x+1))
print(b)

Output

[0, 0, -1, -4, 2, -1, 2, 2]

Demo on rextester

Upvotes: 1

smac89
smac89

Reputation: 43186

The problem as you very well know is that there is an index error.

a=[1,2,5,3,7,8,6,4]

The above array has size = 8.

Now you create b:

b=[0,0,0,0,0,0,0,0]

The size of the list b is also 8.

In your for loop you are doing:

b[a[x]]

Pause...

If x is 5, then a[x] will be 8. However, there is no such thing as index 8 in list b, which only has up to index 7.

This is the problem.

You should change the code in your for-loop to:

b[a[x] - 1]=a[x]-(x+1)

I would suggest you change your loop to this:

for x, n in enumerate(a):
   b[n-1] = n-(x+1)

Upvotes: 1

Related Questions