我正在编写的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'属于下一个子列表。
答案 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']]
>>>