python 尝试运行插入排序时出现属性错误

zujrkrfu  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(127)

我目前正在创建一个海龟游戏,它将在一个记录数组中收集分数和首字母,我想运行一个插入排序,以便向用户显示他们是否收到了前三名中的一个。但是,每当我试图运行代码时,我收到一个属性错误。代码在这里(如果需要,可以提供更多代码):

def insertion_sort(scores):
  value = 0
  i=0
  for i in range(1, len(scores)):
    value = scores[i].Score
    j = i - 1
    while j>= 0 and scores[j].Score > value:
      scores[j + 1].Score = scores[j].Score
      j -=1
    scores[j + 1].Score = value
  return scores

我试过重新整理我的数据,改变它的存储方式,但没有任何帮助。我不确定还有什么可以尝试,因为我试过几种不同的解决方案,但没有任何成功。

ercv8c1e

ercv8c1e1#

有没有可能您只是将一个数字列表传递给函数?因为这也可以解释属性错误:AttributeError: 'int' object has no attribute 'Score'
使用列表解析可以很容易地将数字列表转换为记录列表。(或者像第一个例子中的字典)
否则,您的记录可能会缺少“分数”属性(您是否也使用了大写字母?)
我还使用枚举和切片对代码进行了一些优化,并切换了记录而不是值。

包含名称和分数的记录:

它们可以从具有分数的名字的字典中创建:

class Record:
    def __init__(self, Name, Score):
        self.Name = Name
        self.Score = Score
    def __repr__(self):
        return "%s:%d" % (self.Name, self.Score)

def make_scores(scores):
    return [Record(Name, Score) for Name, Score in scores.items()]

def insertion_sort(scores):
    for j, score in enumerate(scores[1:]):
        value = score.Score
        while j >= 0 and scores[j].Score > value:
            scores[j + 1] = scores[j]
            j -= 1
        scores[j + 1] = score
    return scores

scores = make_scores({
    "Alpha": 0,
    "Bravo": 1,
    "Charlie": 2,
    "Delta": 3,
    "Echo": 7
})
print(insertion_sort(scores))
scores = make_scores({
    "Alpha": 7,
    "Bravo": 3,
    "Charlie": 2,
    "Delta": 1,
    "Echo": 0
})
print(insertion_sort(scores))

输出量:

[Alpha:0, Bravo:1, Charlie:2, Delta:3, Echo:7]
[Echo:0, Delta:1, Charlie:2, Bravo:3, Alpha:7]

我希望这是有帮助的。

只包含分数的记录

它们可以从数字列表中创建:

class Record:
    def __init__(self, score):
        self.Score = score
    def __repr__(self):
        return "%d" % self.Score

def make_scores(scores):
    return [Record(score) for score in scores]

def insertion_sort(scores):
    for j, score in enumerate(scores[1:]):
        value = score.Score
        while j >= 0 and scores[j].Score > value:
            scores[j + 1] = scores[j]
            j -= 1
        scores[j + 1] = score
    return scores

scores = make_scores([0,1,2,3,7])
print(insertion_sort(scores))
scores = make_scores([7,3,2,1,0])
print(insertion_sort(scores))

输出量:

[0, 1, 2, 3, 7]
[0, 1, 2, 3, 7]

相关问题