2016-10-03 18 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