@scottmiller42 Oh, yeah sorry I always forget that step (even in my own coding). Yes, you have to convert it to a list, and yes it does take up memory for that list, but unless the thing you're iterating over (MyString) is really huge, I think it's fine. I mean, yes it's a *little* inelegant, but really not bad IMO.
If you want to work around that, you could write your own reverse enumerate function. Just zip your "reverse range()" with the iterable and return that. Of course that won't work on single-use iterables (like generators, enumerate(), filter(), map(), or so on), but I think there's no way to handle those without storing a copy of their data.
And FWIW you're not wrong that it would be convenient if enumerate() did this itself. But perhaps the fact that you have to choose between (at least) two different implementations depending on what type of iterable you're dealing with is part of why they didn't make it do that.
#Python