此代码应该能够根据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()
答案 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']
让我们看看它是如何工作的:
map
为order.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=
提供排序,因此在内部对这些列表进行排序而不是字符串。