python中for循环的问题

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

这段代码应该能够根据self.order中字符的顺序对self.array中的项进行排序。在第三次迭代之前,sort方法一直正常运行,由于某种原因,for循环似乎无限期地重复。这是怎么回事

编辑:我正在制作自己的排序函数,因为它是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
-此赋值导致
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非常好的排序)应该需要花费点