I’ve got a Perl function which takes a timestamp and returns either the unchanged timestamp (if it’s never seen it before) or otherwise, it appends some letters to make it unique:
sub uniqify($) { my $timestamp = shift; state $last_ts = -1; state $next_letter = 'A'; if ($timestamp == $last_ts) { $timestamp .= $next_letter++; } else { $last_ts = $timestamp; $next_letter = 'A'; } return $timestamp; }
So if you call it four times, with the values 1, 1, 1, and 2, it will return 1, then 1A, then 1B, then 2.
Note: It only ever gets called with ever-increasing timestamps, so it doesn’t need to recall every one it’s ever seen, just the last one.
Now I need to translate this function to Python. I’ve learned that I can replace the ‘state’ variables with globals (yuck!) or perhaps attach them to the function as attributes, but neither of those is particularly elegant.
Also, Python doesn’t have something like Perl’s magic autoincrement, where if you ‘++’ a variable whose value is ‘A’, it becomes ‘B’ — or if it’s ‘Z’, it becomes ‘AA’. So that’s a curveball too.
I’m hacking together a solution, but it’s really ugly and hard to read. Translating from Perl to Python is supposed to have the opposite effect, right? 🙂 So I’m offering this as a challenge to SO users. Can you make it an elegant Python function?
Look at this answer for a robust method to convert a number to an alphanumeric id
The code I present doesn’t go from ‘Z’ to ‘AA’, instead goes to ‘BA’, but I suppose that doesn’t matter, it still produces a unique id
usage:
You can call it maaaany times and it will still produce good results: