2015-11-14 60 views
1

好吧,我有一個列表,我想在列表中的最後一個元素之前移動列表開始處的元素數量,最後一個元素表示數字我需要移動的元素。 例如:[2, 19, 6, 26, 1, 15, 12, 3]並且由於最後一個元素是3,因此結果看起來像[26, 1, 15, 12, 2, 19, 6, 3]。有誰知道我可以如何以這種方式索引列表?在列表中的最後一個元素之前移動第一個元素python

+0

這是一個挑戰嗎?這是否有益於工作?請注意,Python中的列表(與其他語言中的列表不同)並未針對移位/滾動操作進行真正的優化。只要你在小列表上有限的使用,爲什麼不呢?但是如果你想在某個更重要的過程中嵌入這樣的事情,你應該意識到這些操作的複雜性(請參閱https://wiki.python.org/moin/TimeComplexity),也許應該關注基於索引的系統。通過索引列表的開始而不是真正構建新列表,您可能會保留O(1)複雜性而不是O(n)。 –

回答

3
  • 以獲取列表的最後一個項目,你會採取-1日指數(l[-1])。

  • 爲了得到第n項列表,切片從0到nl[0:n]); Python會讓你省略最初的0

  • n得到n到倒數第二個項目中的元素列表,切片-1l[n:-1])。

把所有這一切放在一起,你會使用類似:

def move_items(lst): 
    return lst[lst[-1]:-1] + lst[:lst[-1]] + [lst[-1]] 

在行動:

>>> def move_items(lst): 
...  return lst[lst[-1]:-1] + lst[:lst[-1]] + [lst[-1]] 
... 
>>> move_items([2,19,6,26,1,15,12,3]) 
[26, 1, 15, 12, 2, 19, 6, 3] 
+0

我認爲你也可以'lst [:lst [-1]]'而不是'lst [0:lst [-1]]'。我通常會看到帶有隱式'0'的第一個表單。 (現在真的很誘人,說「保存1個字節」...) – refi64

+1

@ kirbyfan64sos哈哈,謝謝! (打高爾夫球一個字節...) – Doorknob

+1

只需注意IN CASE中最後一個數字(表示有多少人會移動的數字)是'> ='而不是列表中的項目數量,它會再次添加它。 EG:'move_items([2,19,6,26,1,15,12,8]) - >'[2,19,6,26,1,15,12,8,8]'。 – FirstOne

1
def split(x): 
    y = x[:] # make a copy: not to harm incoming list 
    numToMove = y.pop() 
    return (numToMove, y[:numToMove], y[numToMove:]) 

a = [2, 19, 6, 26, 1, 15, 12, 3] 
(num, head, tail) = split(a) 
answer = tail + head + [num] 
+0

我只是用upvoting這個簡單的使用易理解的變量名稱。 – DSM

0

試試這個:

l = [2, 19, 6, 26, 1, 15, 12, 3] 
l2 = l[l[-1]:-1] + l[:l[-1]] + [l[-1]] 
print l2 
0

用模,沒有切片創建一個列表一個版本:

def swap(l): 
    i, ln = l[-1], len(l) - 1 
    for j in range(ln): 
     yield l[(i + j) % ln] 
    yield i 

輸出:

In [2]: l = [2, 19, 6, 26, 1, 15, 12, 3] 

In [3]: list(swap(l)) 
Out[3]: [26, 1, 15, 12, 2, 19, 6, 3] 

或使用collections.deque

from collections import deque 
def swap(l): 
    ln, deq = len(l) - 1, deque(l) 
    i = deq.pop() 
    deq.rotate(ln - i), deq.append(i) 
    return deq 

一個以上精簡版本,但使用更多的內存:

def swap(l): 
    i, ln = l[-1], len(l) - 1 
    return [l[(i + j)% ln] for j in range(ln)] + [i] 

不確定如果最後一個數字大於列表的長度會發生什麼情況,使用模數將意味着循環切片將增加的列表,您將列出添加重複元素的列表,您可能需要專門處理該案例。

+0

我試過了你們的建議,但無濟於事。我需要改變列表。到目前爲止,我有insert_top_to_bottom([1,4,7,10,13,16,19,22,25,28,3,6,9,12,15,18,21,24,27,2,5,8 ,11,14,17,20,23,26]) [23,26,1,4,7,10,13,16,19,22,25,28,3,6,9,12,15, 18,21,24,27,2,5,8,11,14,17,20] – vig143

+0

所以我只需要得到1,4,7,10,13,16,19,22,25,28, 3,6,9,12,15,18,21,24,27,2,5,8,11,14,17,20前面的26 – vig143

+0

@ vig143,你的意思是改變原來的列表?我所有的例子都會給你預期的輸出,如果你想改變原始列表,使用'my_list [:] = swap(my_list)' –

相關問題