Rik Schoonbeek
Rik Schoonbeek

Reputation: 4510

How to get inverse of integer?

I am not sure of inverse is the proper name, but I think it is.

This example will clarify what I need:

I have a max height, 5 for example, and so height can range from 0 to 4. In this case we're talking integers, so the options are: 0, 1, 2, 3, 4.

What I need, given an input ranging from 0 up to (and including) 4, is to get the inverse number.

Example:
input: 3
output: 1

visual:
0 1 2 3 4
4 3 2 1 0

I know I can do it like this:

position_list = list(range(5))
index_list = position_list[::-1]
index = index_list[3]

But this will probably use unnecessary memory, and probably unnecessary cpu usage creating two lists. The lists will be deleted after these lines of code, and will recreated every time the code is ran (within method). I'd rather find a way not needing the lists at all.

What is an efficient way to achieve the same? (while still keeping the code readable for someone new to the code)

Upvotes: 0

Views: 2798

Answers (6)

yatu
yatu

Reputation: 88275

You just need to subtract from the max:

def return_inverse(n, mx):
    return mx - n

For the proposed example:

position_list = list(range(5))
mx = max(position_list)

[return_inverse(i, mx) for i in position_list]
# [4, 3, 2, 1, 0]

Upvotes: 2

Lahel Light
Lahel Light

Reputation: 66

In this case, you can just have the output = 4-input. If it's just increments of 1 up to some number a simple operation like that should be enough. For example, if the max was 10 and the min was 5, then you could just do 9-input+5. The 9 can be replaced by the max-1 and the 5 can be replaced with the min.

So max-1-input+min

Upvotes: 0

David Zemens
David Zemens

Reputation: 53653

You can just derive the index from the list's length and the desired position, to arrive at the "inverse":

position_list = list(range(5))
position = 3
inverse = position_list[len(position_list)-1-position]

And:

for i in position_list:
    print(i, position_list[len(position_list)-1-i])

enter image description here

Upvotes: 0

Attie
Attie

Reputation: 6979

Isn't it just max - in...?

>>> MAX=4
>>> def calc(in_val):
...   out_val = MAX - in_val
...   print('%s -> %s' % ( in_val, out_val ))
...
>>> calc(3)
3 -> 1
>>> calc(1)
1 -> 3

Upvotes: 3

Sheldore
Sheldore

Reputation: 39072

Simply compute the reverse index and then directly access the corresponding element.

n = 5
inp = 3

position_list = list(range(n))
position_list[n-1-inp]
# 1

Upvotes: 0

vurmux
vurmux

Reputation: 10030

You have maximum heigth, let's call it max_h.

Your numbers are counted from 0, so they are in [0; max_h - 1]

You want to find the complementation number that becomes max_h in sum with input number

It is max_h - 1 - your_number:

max_height = 5

input_number = 2

for input_number in range(5):
    print('IN:', input_number, 'OUT:', max_height - input_number - 1)
IN: 1 OUT: 3
IN: 2 OUT: 2
IN: 3 OUT: 1
IN: 4 OUT: 0

Upvotes: 1

Related Questions