In Python, what is the best way to create a new list whose items are the same as those of some other list, but in reverse order? (I don't want to modify the existing list in place.)
Here is one solution that has occurred to me:
new_list = list(reversed(old_list))
It's also possible to duplicate old_list
then reverse the duplicate in place:
new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()
Is there a better option that I've overlooked? If not, is there a compelling reason (such as efficiency) to use one of the above approaches over the other?
Now let's
timeit
. Hint: Alex's[::-1]
is fastest :)Update: Added list comp method suggested by inspectorG4dget. I'll let the results speak for themselves.
The
[::-1]
slicing (which my wife Anna likes to call "the Martian smiley";-) means: slice the whole sequence, with a step of -1, i.e., in reverse. It works for all sequences.Note that this (and the alternatives you mentioned) is equivalent to a "shallow copy", i.e.: if the items are mutable and you call mutators on them, the mutations in the items held in the original list are also in the items in the reversed list, and vice versa. If you need to avoid that, a
copy.deepcopy
(while always a potentially costly operation), followed in this case by a.reverse
, is the only good option.Adjustments
It's worth providing a baseline benchmark/adjustment for the timeit calculations by sdolan which show the performance of 'reversed' without the often unnecessary
list()
conversion. Thislist()
operation adds an additional 26 usecs to the runtime and is only needed in the event an iterator is unacceptable.Results:
Calculations:
Conclusions:
The conclusion of these tests is
reversed()
is faster than the slice[::-1]
by 12.4 usecs