Python中的排行榜-它没有';t在列表中插入团队
我需要为一个项目做一个排行榜。必须有3个文件,2个文件由1个类组成,最后一个文件用于运行程序。我已经完成了所有部分,但是当我调用一个方法来添加一个团队时,程序会添加名称,但不会将其插入团队列表(应该这样做)。当我试图显示列表中的项目时,程序会显示一条错误消息,而不是显示实际的团队 我如何修理它?如果有任何帮助,将不胜感激。:) 这里有几件事: 当我试图显示列表中的项目时,程序在0x000000000332A978处显示:team.team对象,而不是显示实际的团队 用户类的默认显示类似于Python中的排行榜-它没有';t在列表中插入团队,python,Python,我需要为一个项目做一个排行榜。必须有3个文件,2个文件由1个类组成,最后一个文件用于运行程序。我已经完成了所有部分,但是当我调用一个方法来添加一个团队时,程序会添加名称,但不会将其插入团队列表(应该这样做)。当我试图显示列表中的项目时,程序会显示一条错误消息,而不是显示实际的团队 我如何修理它?如果有任何帮助,将不胜感激。:) 这里有几件事: 当我试图显示列表中的项目时,程序在0x000000000332A978处显示:team.team对象,而不是显示实际的团队 用户类的默认显示类似于。如果您
。如果您希望它显示不同的内容,则必须告诉Python您希望显示的内容。此函数有两个单独的函数:。其思想是,第一个是程序员的表示,第二个是用户的表示。如果您不需要两种不同的表示,只需定义\uuuuu repr\uuuu
,它将在需要\uuuu str\uuu
时使用它
因此,解决此问题的一个非常简单的方法是将其添加到团队
类中:
def __repr__(self):
return 'Team("{}")'.format(self._name)
现在,如果您调用league.addTeam('Dodgers')
,然后print(l..\u表)
,您将得到[Team(“Dodgers”)]
,而不是[]
同时,这两种方法可能不是您想要的:
def removeTeam(self,team):
self._table.remove(team)
def returnPosition(self,team):
return self._table.index(team)
这些将删除或查找给定team
对象的团队,而不是名称,甚至是根据名称创建的新team
,而是对存储在\u表中的完全相同对象的引用。这并不是很有用,而且你似乎只想用名字来称呼他们
有两种方法可以解决此问题:通过将此方法添加到类中,您可以更改Team
,使其按名称而不是按对象标识进行比较:
def __eq__(self, other):
return self._name == other._name
这意味着如果你说Team('Giants')==Team('Giants')
,它现在将是真的而不是假的。即使第一支球队在一个不同的联盟,并有不同的W-L记录,等等(例如,像棒球“巨人”来自旧金山与足球“巨人”来自纽约),就Python而言,他们现在是同一个团队。当然,如果这不是您想要的,您可以编写任何其他看起来更合适的\uuuuuuuueq\uuuuuuu
函数
无论如何,如果您这样做,索引
和删除
函数现在将能够找到任何同名的团队
,而不仅仅是同一个团队,因此:
def removeTeam(self,team_name):
self._table.remove(Team(team_name))
def returnPosition(self,team_name):
return self._table.index(Team(team_name))
如果你这样走,你可能想考虑定义所有的,所以你可以,例如,对一组团队进行排序,并且按名称排序。
或者,您可以更改这些方法,使它们不在平等的基础上工作,例如,通过如下方式重新定义它们:
def removeTeam(self,team_name):
self._table = [team for team in self._table if team._name != team_name]
def returnPosition(self,team_name):
return [team._name for team in self._table].index(team_name)
for i, value in enumerate(mylist):
if value == value_to_remove:
del mylist[i]
def addTeam():
name=input("Enter the name of the team:")
l.addTeam(name)
def removeTeam():
teamToRemove=input("Enter the name of the team you want to remove:")
l.removeTeam(teamToRemove)
def recordGame():
team1=input("What is the name of the team?")
ans1=int(input("Enter the number of goals for the first team:"))
team2=input("What is the name of the team?")
ans2=int(input("Enter the number of goals for the second time:"))
l.updateLeague(team1,team2,ans1,ans2)
optionsdict = {
"a": addTeam,
"d": l.displayList,
"s": l.saveList,
"l": l.loadList,
"r": removeTeam,
"rec": recordGame,
}
def options(x):
func = optionsdict.get(x)
if func:
func()
要了解这些是如何工作的,如果您不习惯阅读列表理解,请将每一个都返回到等效的循环中:
self._table = [team for team in self._table if team._name != team_name]
temp = []
for team in self._table:
if team._name != team_name:
temp.append(team)
self._table = temp
如果您单步执行此操作,temp
将得到表中每个团队的列表,但要删除的团队除外,然后将旧的self.\u表
替换为新的筛选表。(如果你知道这个函数的话,写同样想法的另一种方法是使用。)
创建一个新的筛选列表通常比就地修改列表要好。有时会因为性能原因而不这样做,有时会导致非常复杂和难以理解,但通常情况下,进行推理既更快又更简单。此外,修改现有列表会导致以下问题:
def removeTeam(self,team_name):
self._table = [team for team in self._table if team._name != team_name]
def returnPosition(self,team_name):
return [team._name for team in self._table].index(team_name)
for i, value in enumerate(mylist):
if value == value_to_remove:
del mylist[i]
def addTeam():
name=input("Enter the name of the team:")
l.addTeam(name)
def removeTeam():
teamToRemove=input("Enter the name of the team you want to remove:")
l.removeTeam(teamToRemove)
def recordGame():
team1=input("What is the name of the team?")
ans1=int(input("Enter the number of goals for the first team:"))
team2=input("What is the name of the team?")
ans2=int(input("Enter the number of goals for the second time:"))
l.updateLeague(team1,team2,ans1,ans2)
optionsdict = {
"a": addTeam,
"d": l.displayList,
"s": l.saveList,
"l": l.loadList,
"r": removeTeam,
"rec": recordGame,
}
def options(x):
func = optionsdict.get(x)
if func:
func()
玩一会儿,你会发现它实际上不起作用。理解原因有点复杂,你可能不想等到以后再去了解。解决这个问题的常用技巧是迭代列表的一个副本……但是一旦你这样做了,你现在就得到了最糟糕的过滤和最糟糕的同时删除
第二个函数可能有点太聪明了,但让我们看看它:
def returnPosition(self,team_name):
return [team._name for team in self._table].index(team_name)
首先,我创建了一个类似于原始列表的列表,但它只是一个名称列表,而不是团队对象列表。再次,让我们分解列表:
temp = []
for team in self._table:
temp.append(team._name)
或者试着将其翻译成英语:这是表中每个团队的团队名称列表
现在,因为这是一个团队名称列表,我可以使用索引(团队名称)
,它会找到它。而且,由于两个列表具有相同的形状,我知道这也是在原始团队列表中使用的正确索引
一个更简单的解决方案是将\u表
从团队
的列表
更改为目录
将名称映射到团队
s。这可能是最具python风格的解决方案,它看起来比编写列表理解来执行简单操作要简单得多。(这可能也是最有效的,但除非你有一些真正庞大的联盟,否则这几乎不相关。)然后你甚至不需要任何returnPosition
。为此:
def __init__(self):
self._table={}
def addTeam(self,name):
self._table[name]=Team(name)
def removeTeam(self,team_name):
del self._table[team_name]
def returnPosition(self,team_name):
return team_name
def updateLeague(self,team1_name1,team_name2,score1,score2):
if score1>score2:
self._table[team_name1].win()
self._table[team_name2].loss()
elif score1==score2:
self._table[team_name1].draw()
self._table[team_name2].draw()
elif score1<score2:
self._table[team_name1].loss()
self._table[team_name2].win()
正如我所说,我不确定在这种情况下它是否更清晰,但值得考虑。这里有几点:
当我试图显示列表中的项目时,程序在0x000000000332A978处显示:team.team对象,而不是显示实际的团队
用户类的默认显示类似于
。如果您希望它显示不同的内容,则必须告诉Python您希望显示的内容。此函数有两个单独的函数:。其思想是,第一个是程序员的表示,第二个是用户的表示。如果您不需要两种不同的表示,只需定义\uuuuu repr\uuuu
,它将在需要\uuuu str\uuu
时使用它
因此,解决此问题的一个非常简单的方法是将其添加到团队
类中:
def __repr__(self):
return 'Team("{}")'.format(self._name)
现在,如果您调用league.addTe