python中for循环的问题
这段代码应该能够根据self.order中字符的顺序对self.array中的项进行排序。在第三次迭代之前,sort方法一直正常运行,由于某种原因,for循环似乎无限期地重复。这是怎么回事 编辑:我正在制作自己的排序函数,因为它是python任务的一个额外部分python中for循环的问题,python,class,for-loop,Python,Class,For Loop,这段代码应该能够根据self.order中字符的顺序对self.array中的项进行排序。在第三次迭代之前,sort方法一直正常运行,由于某种原因,for循环似乎无限期地重复。这是怎么回事 编辑:我正在制作自己的排序函数,因为它是python任务的一个额外部分 class sorting_class: def __init__(self): self.array = ['ca', 'bd', 'ac', 'ab'] #An array of strings
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
-此赋值导致self.leave.append(arrayi)
将元素附加到列表self.arrayt
引用的列表中
一般来说,您可能会考虑创建列表的副本,而不仅仅是将不同的变量/成员分配给相同的列表实例。您有
self.arrayt=self.leave
,这使得arrayt
引用与leave
完全相同的数组(它不是内容的副本!!!),然后在self.arrayt中的arrayi的循环中:你犯下了一个self.leave.append(arrayi)
——它的长度是self.leave
,这只是你正在循环的列表的另一个名称。添加到正在循环的列表中是无限循环的好方法
这只是该代码无法解决的混乱的一个症状。我建议您使用内置的
sort
方法进行排序,并将精力放在定义正确的key=
key extractor函数上,以便按照您想要的方式对事物进行排序,从而更有效地利用您的时间。Alex提到的key extractor非常简单,可以放入lambda作用
>>> array = ['ca', 'bd', 'ac', 'ab']
>>> order = ['a', 'b', 'c', 'd']
>>> sorted(array, key=lambda v:map(order.index,v))
['ab', 'ac', 'bd', 'ca']
>>> order = ['b', 'a', 'c', 'd']
>>> sorted(array, key=lambda v:map(order.index,v))
['bd', 'ab', 'ac', 'ca']
>>> order = ['d', 'c', 'b', 'a']
>>> sorted(array, key=lambda v:map(order.index,v))
['ca', 'bd', 'ac', 'ab']
让我们看看它是如何工作的:
map
为v
中的每个项目调用方法order.index
,并使用这些返回值创建列表。v
将是array
>>> order = ['a', 'b', 'c', 'd']
>>> map(order.index,array[0])
[2, 0]
>>> map(order.index,array[1])
[1, 3]
>>> map(order.index,array[2])
[0, 2]
>>> map(order.index,array[3])
[0, 1]
该函数以
键=
的形式提供,用于排序,因此在内部对这些列表进行排序,而不是对字符串进行排序。您不使用Pythonic机制进行排序的具体原因是什么?请向上投票。显示错误代码≠ 糟糕的问题!他还将其标记为初学者,因此他需要一些帮助:)这是python类作业的一部分。对于奖励分数,我们可以创建自己的类来进行排序。我们将类命名为FooBar
,而不是FooBar
。尽管Python提供了一些没有这样命名的类型,但人们还是一致希望用户定义类的名称大写。我正在制作自己的排序函数,以在python作业中获得额外分数。@Protean,在一个明智的过程中,重新发明轮子(使用自己的排序,而不是python非常好的排序)应该需要花费点