Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的排行榜-它没有';t在列表中插入团队_Python - Fatal编程技术网

Python中的排行榜-它没有';t在列表中插入团队

Python中的排行榜-它没有';t在列表中插入团队,python,Python,我需要为一个项目做一个排行榜。必须有3个文件,2个文件由1个类组成,最后一个文件用于运行程序。我已经完成了所有部分,但是当我调用一个方法来添加一个团队时,程序会添加名称,但不会将其插入团队列表(应该这样做)。当我试图显示列表中的项目时,程序会显示一条错误消息,而不是显示实际的团队 我如何修理它?如果有任何帮助,将不胜感激。:) 这里有几件事: 当我试图显示列表中的项目时,程序在0x000000000332A978处显示:team.team对象,而不是显示实际的团队 用户类的默认显示类似于。如果您

我需要为一个项目做一个排行榜。必须有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