Efficient way to rotate a list in python

后端 未结 26 1146
一生所求
一生所求 2020-11-22 03:14

What is the most efficient way to rotate a list in python? Right now I have something like this:

>>> def rotate(l, n):
...     return l[n:] + l[:n]         


        
26条回答
  •  既然无缘
    2020-11-22 03:37

    What is the use case? Often, we don't actually need a fully shifted array --we just need to access a handful of elements in the shifted array.

    Getting Python slices is runtime O(k) where k is the slice, so a sliced rotation is runtime N. The deque rotation command is also O(k). Can we do better?

    Consider an array that is extremely large (let's say, so large it would be computationally slow to slice it). An alternative solution would be to leave the original array alone and simply calculate the index of the item that would have existed in our desired index after a shift of some kind.

    Accessing a shifted element thus becomes O(1).

    def get_shifted_element(original_list, shift_to_left, index_in_shifted):
        # back calculate the original index by reversing the left shift
        idx_original = (index_in_shifted + shift_to_left) % len(original_list)
        return original_list[idx_original]
    
    my_list = [1, 2, 3, 4, 5]
    
    print get_shifted_element(my_list, 1, 2) ----> outputs 4
    
    print get_shifted_element(my_list, -2, 3) -----> outputs 2 
    

提交回复
热议问题