f



IndexError: list index out of range

hi
i am begginer in python. I have written a code and given this error:
IndexError: list index out of range

In my program, I have h=32 bits input. i divide this 32 bits to 4*8 block and every 8-block is n. so n=0:7;(h=int(n/4))
I want to rotate 0 to 7 bits for 2 bits: 0,1,2,3,4,5,6,7--->2,3,4,5,6,7
Iwrite this code:
def rottwo(self, X, n, r):
        assert r >= 1
        temp = [None]*n
        for i in range(n-r) :
            temp[i] = X[i+r]
        for i in range(n-r,n) :
            temp[i] = X[i-n+r]
        return temp
this function work correctly. but I also want to rotate 24 to 31 bits for 5 bits: 24,25,26,27,28,29,30,31-->29,30,31,24,25,26,27,28

when I write this code:
def rotfive(self, X, n, r):
       assert r >= 1
       temp = [None]*n
       for i in range(n-r) :
            temp[i+24] = X[i+3*n+r]
       for i in range(n-r,n) :
            temp[i+24] = X[i+2*n+r]
       return temp 
beacase temp is of size n I cannot access index 3*n+i. index on the list temp should be less than equal to n-1 . 
I son't know how I must correct this!!!!!!!!
Is there any one to help me?
thanks in advanse.
0
Elnaz
12/13/2016 7:47:33 AM
comp.lang.python 77058 articles. 6 followers. Post Follow

2 Replies
674 Views

Similar Articles

[PageSpeed] 36

Elnaz wrote:

> hi
> i am begginer in python. I have written a code and given this error:
> IndexError: list index out of range
> 
> In my program, I have h=32 bits input. i divide this 32 bits to 4*8 block
> and every 8-block is n. so n=0:7;(h=int(n/4)) I want to rotate 0 to 7 bits
> for 2 bits: 0,1,2,3,4,5,6,7--->2,3,4,5,6,7 Iwrite this code:
> def rottwo(self, X, n, r):
>         assert r >= 1
>         temp = [None]*n
>         for i in range(n-r) :
>             temp[i] = X[i+r]
>         for i in range(n-r,n) :
>             temp[i] = X[i-n+r]
>         return temp
> this function work correctly. but I also want to rotate 24 to 31 bits for
> 5 bits: 24,25,26,27,28,29,30,31-->29,30,31,24,25,26,27,28
> 
> when I write this code:
> def rotfive(self, X, n, r):
>        assert r >= 1
>        temp = [None]*n
>        for i in range(n-r) :
>             temp[i+24] = X[i+3*n+r]
>        for i in range(n-r,n) :
>             temp[i+24] = X[i+2*n+r]
>        return temp
> beacase temp is of size n I cannot access index 3*n+i. index on the list
> temp should be less than equal to n-1 . I son't know how I must correct
> this!!!!!!!! Is there any one to help me?
> thanks in advanse.

I think you are making this harder than necessary. Python slices make 
accessing parts of a list quite elegant:

>>> items
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> items[2:5]
[20, 30, 40]
>>> items[3:]
[30, 40, 50, 60, 70, 80, 90]

You can use this to implement a function that creates a rotated list with an 
arbitrary offset:

>>> def rot(items, offset):
....     return items[offset:] + items[:offset]
.... 
>>> rot(items, 2)
[20, 30, 40, 50, 60, 70, 80, 90, 0, 10]
>>> rot(items, 7)
[70, 80, 90, 0, 10, 20, 30, 40, 50, 60]
>>> rot(items, -2)
[80, 90, 0, 10, 20, 30, 40, 50, 60, 70]

To rotate part of a list extract that part using slice notation, rotate it 
and write it back:

>>> def rot_part(items, offset, start, stop):
....     items = list(items)
....     items[start:stop] = rot(items[start:stop], offset)
....     return items
.... 
>>> rot_part(range(32), 5, 24, 32)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
21, 22, 23, 29, 30, 31, 24, 25, 26, 27, 28]

If you pass a list as the first argument

items = list(items) 

makes of copy of the list, but it will also convert an arbitrary iterable to 
a list. That's why I can pass the range object.

0
Peter
12/13/2016 9:15:03 AM
On Tuesday, December 13, 2016 at 12:45:49 PM UTC+3:30, Peter Otten wrote:
> Elnaz wrote:
> 
> > hi
> > i am begginer in python. I have written a code and given this error:
> > IndexError: list index out of range
> > 
> > In my program, I have h=32 bits input. i divide this 32 bits to 4*8 block
> > and every 8-block is n. so n=0:7;(h=int(n/4)) I want to rotate 0 to 7 bits
> > for 2 bits: 0,1,2,3,4,5,6,7--->2,3,4,5,6,7 Iwrite this code:
> > def rottwo(self, X, n, r):
> >         assert r >= 1
> >         temp = [None]*n
> >         for i in range(n-r) :
> >             temp[i] = X[i+r]
> >         for i in range(n-r,n) :
> >             temp[i] = X[i-n+r]
> >         return temp
> > this function work correctly. but I also want to rotate 24 to 31 bits for
> > 5 bits: 24,25,26,27,28,29,30,31-->29,30,31,24,25,26,27,28
> > 
> > when I write this code:
> > def rotfive(self, X, n, r):
> >        assert r >= 1
> >        temp = [None]*n
> >        for i in range(n-r) :
> >             temp[i+24] = X[i+3*n+r]
> >        for i in range(n-r,n) :
> >             temp[i+24] = X[i+2*n+r]
> >        return temp
> > beacase temp is of size n I cannot access index 3*n+i. index on the list
> > temp should be less than equal to n-1 . I son't know how I must correct
> > this!!!!!!!! Is there any one to help me?
> > thanks in advanse.
> 
> I think you are making this harder than necessary. Python slices make 
> accessing parts of a list quite elegant:
> 
> >>> items
> [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
> >>> items[2:5]
> [20, 30, 40]
> >>> items[3:]
> [30, 40, 50, 60, 70, 80, 90]
> 
> You can use this to implement a function that creates a rotated list with an 
> arbitrary offset:
> 
> >>> def rot(items, offset):
> ...     return items[offset:] + items[:offset]
> ... 
> >>> rot(items, 2)
> [20, 30, 40, 50, 60, 70, 80, 90, 0, 10]
> >>> rot(items, 7)
> [70, 80, 90, 0, 10, 20, 30, 40, 50, 60]
> >>> rot(items, -2)
> [80, 90, 0, 10, 20, 30, 40, 50, 60, 70]
> 
> To rotate part of a list extract that part using slice notation, rotate it 
> and write it back:
> 
> >>> def rot_part(items, offset, start, stop):
> ...     items = list(items)
> ...     items[start:stop] = rot(items[start:stop], offset)
> ...     return items
> ... 
> >>> rot_part(range(32), 5, 24, 32)
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
> 21, 22, 23, 29, 30, 31, 24, 25, 26, 27, 28]
> 
> If you pass a list as the first argument
> 
> items = list(items) 
> 
> makes of copy of the list, but it will also convert an arbitrary iterable to 
> a list. That's why I can pass the range object.



i really appreciate your help. it works.
0
Elnaz
12/14/2016 6:38:06 AM
Reply: