python中forloop的问题

2024-06-16 15:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

这个代码应该能够对项目进行排序自身数组根据中字符的顺序自我命令. 方法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()

Tags: theselfforleniftimemysort
3条回答

您有self.arrayt = self.leave,它使arrayt引用与leave完全相同的数组(它是不是内容的副本!!!),然后在循环for arrayi in self.arrayt:中,您将生成一个长度为self.leaveself.leave.append(arrayi),这只是您正在循环的列表self.arrayt的另一个名称。附加到你正在循环的列表中是无限循环的好方法。在

这只是代码无法解决的混乱的一个症状。我建议您使用内置的sort方法进行排序,并将精力投入到定义正确的key=键提取函数上,以使事情按照您希望的方式进行排序,从而更有效地利用您的时间。在

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']

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

mapv中的每个项调用方法order.index,并使用这些返回值创建一个列表。
v将是{}的元素之一

^{pr2}$

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

在循环的第三个过程中,您将向要迭代的列表追加新元素,因此您永远不能离开循环:
self.arrayt = self.leave-此赋值导致self.leave.append(arrayi)将向self.arrayt引用的列表追加元素。在

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

相关问题 更多 >