如何修复似乎正在进行额外循环的python程序?

时间:2016-10-03 22:33:58

标签: python list loops if-statement while-loop

我正在编写的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']]。请注意每个“双”字符后的额外空列表。似乎循环正在进行一次额外的迭代,或者if之前的listB.append([])语句未正确写入。

我似乎无法解决这个问题。提前感谢您的帮助。

注意:elementsCounted应该是从listA处理的每个元素的累积计数。 i是listB中当前元素的索引。例如,如果['A','A','B']是listA并且程序正在处理第二个A,那么它是第二个被计数的元素,但是i仍然是0,因为它属于listB [0]。 currentElement是当前正在处理的那个,并且它与作为“i”处理的第一个元素进行比较。对于['A','A','B'] example, when processing the second A, it is being compared to the first A to see if i should be incremented. In the next loop, it is comparing 'B' to the first 'A' and thus will increase i`为一,因为'B'属于下一个子列表。

2 个答案:

答案 0 :(得分:1)

你的错误在于这部分:

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

应该是:

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

对于这么简单的任务来说,这是一个过于复杂的功能。

答案 1 :(得分: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']]
>>>