python中的for循环问题

时间:2010-03-14 23:50:03

标签: python class for-loop

此代码应该能够根据self.order中字符的顺序对self.array中的项进行排序。方法排序正常运行,直到第三次迭代,由于某种原因unil因为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()

3 个答案:

答案 0 :(得分:1)

在循环的第三次传递过程中,您将新元素附加到正在迭代的列表中,因此您永远不能离开循环:
self.arrayt = self.leave - 此作业导致self.leave.append(arrayi)将元素附加到列表self.arrayt所引用的事实。

通常,您可以考虑创建列表副本,而不仅仅是将不同的变量/成员分配给相同的列表实例。

答案 1 :(得分:1)

你有self.arrayt = self.leave使arrayt引用与leave完全相同的数组(它的不是内容的副本!!!),然后在循环for arrayi in self.arrayt:中,您执行了self.leave.append(arrayi) - 它会缩短self.leave,这只是您循环播放的列表self.arrayt的另一个名称。附加到循环的列表是无限循环的好方法。

这只是这段代码无法解决的混乱的一个症状。我建议您使用内置的sort方法进行排序,并将精力放在定义正确的key=键提取器函数上,以便按照您想要的方式对事物进行排序 - 更有效地利用您的时间。

答案 2 :(得分:1)

关键提取器Alex提到的很简单,可以放入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']

让我们看看它是如何工作的:

maporder.index中的每个项调用方法v,并使用这些返回值创建列表。
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]

该函数作为key=提供排序,因此在内部对这些列表进行排序而不是字符串。