list – Circular array indices in Python

list – Circular array indices in Python

You can use modulo operator, like this

print a[3 % len(a)] 

If you dont want to use modulo operator like this, you need to subclass list and implement __getitem__, yourself.

class CustomList(list):
    def __getitem__(self, index):
        return super(CustomList, self).__getitem__(index % len(self))

a = CustomList([1, 2, 3])
for index in xrange(5):
    print index, a[index]

Output

0 1
1 2
2 3
3 1
4 2

If you want to do the same with Numpy Arrays, you can do like this

import numpy as np

class CustomArray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        return np.asarray(args[0]).view(cls)

    def __getitem__(self, index):
        return np.ndarray.__getitem__(self, index % len(self))

a = CustomArray([1, 2, 3])
for index in xrange(5):
    print a[index]

More information about Subclassing Numpy Arrays can be found here (Thanks to JonClements)

Having such functionality is not good for your code. Instead write a generator function which generates you round robin values.

numbers = [1, 2, 3]

def returnNumber():
    
    A circular array for yielding list members repeatedly 
    
    index = -1
    while True:
        index += 1
        yield slangWords[index % len(numbers)]

# Now you can use this generator
numberGenerator = returnNumber()
numberGenerator.next() # returns 1 
numberGenerator.next() # returns 2
numberGenerator.next() # returns 3
numberGenerator.next() # returns 1
numberGenerator.next() # returns 2

list – Circular array indices in Python

You can very simply:

mainArr = [5,2,1,4,2]
def getRangeArray(startIndexInMainArray):
    s = mainArr[startIndexInMainArray::]
    b=len(mainArr)-len(s)
    return (s+mainArr[0:b])

print(mainArr)
print(getRangeArray(4)) # What is the first index?

#for index 4
#[5, 2, 1, 4, 2]  before
#[2, 5, 2, 1, 4]  after

#for index 2
#[5, 2, 1, 4, 2]  before
#[1, 4, 2, 5, 2]  after

#for index 0
#[5, 2, 1, 4, 2]  before
#[5, 2, 1, 4, 2]  after

Leave a Reply

Your email address will not be published.