2016-10-03 22 views
0

我正在編寫的python程序的一部分似乎在循環一段時間。程序中不工作的部分在下面。它應該從用戶請求一個字符串並創建一個二維列表,其中字符串的每個不同字符都放在其自己的子列表中。 (希望這是有道理的......如果不是我可以嘗試解釋更好。也許代碼將幫助)如何修復似乎在做額外循環的python程序?

def getInput(emptyList): 
    inputString = input("Please enter a sentence:\n").strip().upper() 
    functionList = [x for x in inputString] 
    emptyList.extend(functionList) 
    return 0 

def sortList(listA,listB): 
    listA.sort() 
    currentElement = listA[0] 
    compareTo = listA[0] 
    elementsCounted = 0 
    i = 0 
    listB.append([]) 
    while elementsCounted < len(listA): 
     while currentElement == compareTo: 
      listB[i].append(currentElement) 
      elementsCounted += 1 
      print(listB) 
      if elementsCounted < len(listA): 
       currentElement = listA[elementsCounted] 
      else: 
       break 
     if currentElement != compareTo: 
      i += 1 
      listB.append([]) 
      compareTo = listA[i] 

    return 0 

def main(): 
    myList = list() 
    sortedList = list() 
    getInput(myList) 
    sortList(myList,sortedList) 
    print(sortedList) 

main() 

如果用戶輸入qwerty,該程序返回[['E'], ['Q'], ['R'], ['T'], ['W'], ['Y']]這是正確的,但如果用戶輸入qwwerrty的程序返回[['E'], ['Q'], ['R', 'R'], [], ['T'], ['W', 'W'], [], ['Y']]。注意每個「雙」字符後的多餘空列表。看起來循環正在進行一次額外的迭代,或者listB.append([])之前的if語句未正確編寫。

我似乎無法弄清楚這一點。預先感謝您的幫助。

注意:elementsCounted應該是從listA處理的每個元素的累計計數。 i是listB中當前元素的索引。例如,如果['A','A','B']是listA並且程序正在處理第二個A,則它是第二個正在計數的元素,但i仍然爲0,因爲它屬於listB [0]。 currentElement是當前正在處理的一個,它正在與作爲「我」處理的第一個元素進行比較。因爲'B'屬於下一個子列表,因此我們只需要一個。

+1

爲什麼你有獨立的'elementsCounted'和'i'變量?它看起來像你總是希望'currentElement'和'compareTo'是相鄰的元素,但你讓它們不同步。您應該使用較少容易出錯的方式迭代元素對。 Google'Python成對地遍歷列表'以找到一些替代方案。 – user2357112

+0

我更新了這個問題,試圖解釋變量的用法。我會谷歌,看看我能找到什麼。 – Jacob

+0

這聽起來像你試圖做的事情可以通過使用itertools.Counter導入來實現。如果你傳遞一個字符串,你會得到每個字母發生多少次的字典。 – Shadow

回答

1

你的錯誤在於,這一部分:

if currentElement != compareTo: 
    ... 
    compareTo = listA[i] 

它應該是:

if currentElement != compareTo: 
    ... 
    compareTo = listA[elementsCounted] 

它是這樣一個簡單的任務過於複雜的功能。

+1

謝謝!這工作。關於它比需要更復雜的說法,更簡單的方法是什麼? – Jacob

1

如果你想有一個簡單的方法:

>>> def make_lists(inp): 
... i = 0 
... indices = {} 
... result = [] 
... for c in sorted(inp): 
...  if c not in indices: 
...  result.append([c]) 
...  indices[c] = i 
...  i += 1 
...  else: 
...  result[indices[c]].append(c) 
... return result 
... 
>>> make_lists("qwerty") 
[['e'], ['q'], ['r'], ['t'], ['w'], ['y']] 
>>> make_lists("qwwerrty") 
[['e'], ['q'], ['r', 'r'], ['t'], ['w', 'w'], ['y']] 
>>> 

或者,如果你想要一個班輪:

>>> import itertools 
>>> [list(g) for _,g in itertools.groupby(sorted('qwwerrty'))] 
[['e'], ['q'], ['r', 'r'], ['t'], ['w', 'w'], ['y']] 
>>> 
+0

Upvote for edit。這是我想到的解決方案。 – fzzle

+2

非常好。感謝您的解決方案。目前,我對Python有點了解,瞭解所有這些,但我當然期待着達到這一點!這個簡潔令人印象深刻。不幸的是,我無法贊成,因爲我對Stack Overflow太新了。 – Jacob