2017-10-04 52 views
1

問題提出:編寫一個函數,它將一個字符列表作爲參數,並返回一個反映該列表運行長度編碼的列表。返回列表中的元素遵循以下模式:偶數索引包含字符,奇數索引包含字符連續重複的次數。運行長度編碼Python

當我在函數中鍵入一個列表時,它不遍歷整個列表的長度。它將適用於較短長度的列表,但不適用於較長的列表。不確定如何修復它。

def runLengthEncoding(myList): 
    aList=[] 
    count=1 
    for i in range(1,len(myList)): 
     if myList[i] == myList[i-1]: 
      count=count+1 
     else: 
      aList.append(myList[i-1]) 
      aList.append(count) 
      count=1 
      if i == (len(myList)-1): 
       aList.append(myList[i]) 
       aList.append(count) 
    return aList 
+0

請出示你的代碼(請不要表現出你的code_的_screenshot)。 – birryree

+0

修復它@birryree –

+0

什麼讓你覺得「它不遍歷整個列表的長度」更長的列表?你有沒有列舉失敗的具體例子?你觀察到了什麼具體的行爲,使你認爲它沒有重複整個輸入? – user2357112

回答

1

您的代碼失敗在最後一個項目(S)都在重複,或當列表的長度爲1:

>>> runLengthEncoding("fooobar") 
['f', 1, 'o', 3, 'b', 1, 'a', 1, 'r', 1] 
>>> runLengthEncoding("fooobarr") 
['f', 1, 'o', 3, 'b', 1, 'a', 1] 
>>> runLengthEncoding("a") 
[] 

一種解決方案的解決將是消除三大行從if i == (len(myList)-1):開始,並將其替換爲

if myList: 
    aList.append(myList[-1]) 
    aList.append(count) 

將該塊移到循環之外。


然而,爲了實現遊程編碼很可能會利用迭代最簡單的方法:

from itertools import chain, groupby 

def run_length(iterable): 
    return list(chain.from_iterable(
     (val, len([*thing])) 
     for val, thing in groupby(iterable) 
    )) 
+1

你的答案似乎過於複雜。如果'myList'不是空的,循環終止時'count'將始終有效。因此,對原始代碼的簡單修正是將最後三行移出循環,並用'if len(myList)> 0:aList.append(myList [-1])替換它們; aList.append(計數)'。 – ekhumoro

+0

PS:對於單個終止字符(例如''a「或'」abc「'),測試'if count> 1'將失敗 – ekhumoro

+0

@ekhumoro如果保留原來的最後3行,則不會。 – L3viathan