我是Python的新手,所以如果我犯了任何愚蠢的错误,我很抱歉。我有一个方法 isSorted()。如果两个列表(a和b)相同,我希望此方法返回True:
class Puzzle:
def isSorted(self):
return set(self.a) == set(self.b)
我在课外使用此方法,如下所示:
puzzle = Puzzle()
while puzzle.isSorted():
#do things
循环永远不会结束。有什么方法可以解决这个问题吗,这是不好的代码?我试过了
puzzleIsSorted = puzzle.isSorted()
在课外,并在while循环中重新分配它,但它仍然无法正常工作。
编辑:完整代码:
import random
class Puzzle:
def __init__(self):
self.f = open("file.txt", "r")
self.a = self.f.readlines()
self.b = self.a
random.shuffle(self.b)
def swapLine(self, line):
self.b[len(self.b) - 1], self.b[line] = self.b[line], self.b[len(self.b) - 1]
def isSorted(self):
return set(self.a) == set(self.b)
puzzle = Puzzle()
moveCount = 0
print `puzzle.b`
while not puzzle.isSorted():
x = input("Enter a line to swap: ")
puzzle.swapLine(x)
print "\n" + `puzzle.b`
print "Game over in " + `moveCount` + " moves"
答案 0 :(得分:3)
首先,您必须复制列表才能在Puzzle
__init__
中创建一个新列表:
def __init__(self):
self.f = open("file.txt", "r")
self.a = self.f.readlines()
# you must copy the list to make another list
self.b = self.a[:]
random.shuffle(self.b)
在你的方法中:
def isSorted(self):
return set(self.a) == set(self.b)
条件始终为True
,因为您只交换行,不添加或删除它们。 set
不关心订单。
如果您想查看订单,可以放弃套装:
def isSorted(self):
return self.a == self.b
答案 1 :(得分:3)
你非常关闭。做两个改变。 1)不要使用集合,坚持使用列表,因为它们确保顺序重要,而集合忽略排序。 2)确保使用切片而不是 b 的赋值来制作列表的副本。当前代码为同一列表生成 a 和 b 别名。
以下是一些可以帮助您入门的工作代码:
import random
text = '''\
Dog
Fox
Cat
Rat
Jay
'''
class Puzzle:
def __init__(self):
self.a = text.splitlines()
self.b = self.a[:] # <== Fixed: Make a copy using slicing
random.shuffle(self.b)
def swapLine(self, line):
self.b[len(self.b) - 1], self.b[line] = self.b[line], self.b[len(self.b) - 1]
def isSorted(self):
return self.a == self.b # <== Fixed: Don't use sets
puzzle = Puzzle()
moveCount = 0
print `puzzle.b`
while not puzzle.isSorted():
x = random.randrange(5) # <== Made this automatic for testing purposes
puzzle.swapLine(x)
print `puzzle.b`
moveCount += 1 # <== Fixed: Update the move counter
print "Game over in " + `moveCount` + " moves"