a better way to invert a list?

Peter Otten __peter__ at web.de
Wed Apr 6 05:58:35 EDT 2011


Glazner wrote:

>> > def invert(p):
>> > inverse = [None] * len(p)
>> > for (i, j) in enumerate(p):
>> > inverse[j] = i
>> > return inverse
>>
>> Elegant. This seems like the best solution, although it isn't as much
>> fun to write as a "one-liner". Thanks
> 
> 
>>>> invert([1, 2, 3, 1])
> [None, 3, 1, 2] #blah

1 occurs twice in [1, 2, 3, 1] which therefore doesn't describe a 
permutation. In general a function has to be "bijective" to be invertable. 
You can catch the problem with (untested)

def invert(p):
    inverse = [None] * len(p)
    for i, k in enumerate(p):
        if inverse[k] is not None:
            raise ValueError
        inverse[k] = i
    return inverse




More information about the Python-list mailing list