Home > Software engineering >  Proper Way to Shift Integer Into List Index Range
Proper Way to Shift Integer Into List Index Range

Time:08-26

I need to retrieve the item at index i from list l. However, sometimes i falls outside of the range of the list index and throws an IndexError. I need to shift i to always be inside the range of the list index by leaps of len(l). The following code achieves just that.

l = ['a', 'b', 'c', 'd', 'e']

i = 6

while i >= len(l):
    i -= len(l)
while i < 0:
    i  = len(l)

item = l[i] # item = 'b'

For my use case, i never falls more than len(l) out of range in either direction, so I'm able to shorten to this one liner by using if statements instead of while statements.

l = ['a', 'b', 'c', 'd', 'e']

i = -3

i = i-len(l) if i >= len(l) else i len(l) if i < 0 else i

item = l[i] # item = 'c'

I'm thinking there must be some builtin function that achieves just this result, without a long, logical sentence. Is there a proper way to do this?

CodePudding user response:

Seems like a perfect use case for the modulo operator.

item = l[i % len(l)]

CodePudding user response:

No, there's no built-in function to do this. But it's simple to create one.

def clamp(x, size):
    return max(0, min(x, size-1))

CodePudding user response:

How about i = max(0, min(i, len(lst)-1))

lst = list(range(5))

i = 25
i = max(0, min(i, len(lst)-1))
print(lst[i])

i = -25
i = max(0, min(i, len(lst)-1))
print(lst[i])

Output

4
0
  • Related