这个代码应该能够对项目进行排序自身数组根据中字符的顺序自我命令. 方法sort在第三次迭代之前正常运行,由于某种原因for循环似乎无限期重复。这是怎么回事?在
编辑:我正在创建我自己的sort函数,因为它是python任务的一个额外部分。在
class sorting_class:
def __init__(self):
self.array = ['ca', 'bd', 'ac', 'ab'] #An array of strings
self.arrayt = []
self.globali = 0
self.globalii = 0
self.order = ['a', 'b', 'c', 'd'] #Order of characters
self.orderi = 0
self.carry = []
self.leave = []
self.sortedlist = []
def sort(self):
for arrayi in self.arrayt: #This should only loop for the number items in self.arrayt. However, the third time this is run it seems to loop indefinitely.
print ('run', arrayi) #Shows the problem
if self.order[self.orderi] == arrayi[self.globali]:
self.carry.append(arrayi)
else:
if self.globali != 0:
self.leave.append(arrayi)
def srt(self):
self.arrayt = self.array
my.sort() #First this runs the first time.
while len(self.sortedlist) != len(self.array):
if len(self.carry) == 1:
self.sortedlist.append(self.carry)
self.arrayt = self.leave
self.leave = []
self.carry = []
self.globali = 1
self.orderi = 0
my.sort()
elif len(self.carry) == 0:
if len(self.leave) != 0: #Because nothing matches 'aa' during the second iteration, this code runs the third time"
self.arrayt = self.leave
self.globali = 1
self.orderi += 1
my.sort()
else:
self.arrayt = self.array
self.globalii += 1
self.orderi = self.globalii
self.globali = 0
my.sort()
self.orderi = 0
else: #This is what runs the second time.
self.arrayt = self.carry
self.carry = []
self.globali += 1
my.sort()
my = sorting_class()
my.srt()
您有
self.arrayt = self.leave
,它使arrayt
引用与leave
完全相同的数组(它是不是内容的副本!!!),然后在循环for arrayi in self.arrayt:
中,您将生成一个长度为self.leave
的self.leave.append(arrayi)
,这只是您正在循环的列表self.arrayt
的另一个名称。附加到你正在循环的列表中是无限循环的好方法。在这只是代码无法解决的混乱的一个症状。我建议您使用内置的
sort
方法进行排序,并将精力投入到定义正确的key=
键提取函数上,以使事情按照您希望的方式进行排序,从而更有效地利用您的时间。在Alex提到的关键提取器非常简单,可以放入lambda函数
让我们看看这是如何工作的:
}的元素之一
^{pr2}$map
为v
中的每个项调用方法order.index
,并使用这些返回值创建一个列表。v
将是{函数以
key=
的形式提供以进行排序,因此在内部对这些列表而不是字符串进行排序。在在循环的第三个过程中,您将向要迭代的列表追加新元素,因此您永远不能离开循环:
self.arrayt = self.leave
-此赋值导致self.leave.append(arrayi)
将向self.arrayt
引用的列表追加元素。在一般来说,您可以考虑创建列表的副本,而不仅仅是将不同的变量/成员分配给相同的列表实例。在
相关问题 更多 >
编程相关推荐