类和while循环?

时间:2014-12-13 02:22:40

标签: python

我是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"

2 个答案:

答案 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"