Python 应为两个参数,而不是三个错误

Python 应为两个参数,而不是三个错误,python,dictionary,Python,Dictionary,以下代码在我尝试将三项添加到字典时出错: from collections import deque #setting up a dictionary so that only the recent most recent values are stored player_stats = {} with open("players.dat") as f: for line in f: classcode, name, score = line.split()

以下代码在我尝试将三项添加到字典时出错:

from collections import deque

#setting up a dictionary so that only the recent most recent values are stored
player_stats = {}
with open("players.dat") as f:
    for line in f:
        classcode, name, score = line.split()
        player_stats.setdefault(classcode, name, deque(maxlen=3))  
        player_stats[name].append(int(score))       

print(player_stats)
from collections import deque

#setting up a dictionary so that only the recent most recent values are stored
player_stats = {}
with open("players.dat") as f:
    for line in f:
        classcode, name, score = line.split()
        key, score = (classcode, name), int(score)
        player_stats.setdefault(key, deque(maxlen=3)).append(score)

print(player_stats)
我的数据是:


1鲁尼56等其他球员。我看不出我做错了什么。

问题是dict采用键/值对,因此需要对额外的信息进行分组。下面的示例将为每个玩家保留最后3个类代码和分数对。我使用defaultdict而不是getdefault,因为getdefault将为每个get创建并通常立即丢弃一个deque

from collections import deque, defaultdict

#setting up a dictionary so that only the recent most recent values are stored
player_stats = defaultdict(lambda:deque(maxlen=3))
with open("players.dat") as f:
    for line in f:
        classcode, name, score = line.split()
        player_stats[name].append((classcode, int(score)))      

print(player_stats)
如果你想追踪每个课程代码的最后3个分数,你可以

from collections import deque, defaultdict

#setting up a dictionary so that only the recent most recent values are stored
player_stats = defaultdict(lambda: defaultdict(lambda: deque(maxlen=3)))
with open("players.dat") as f:
    for line in f:
        classcode, name, score = line.split()
        player_stats[name][classcode].append(int(score))

print(player_stats)

从注释中可以清楚地看出,每个类的名称都是唯一的,也就是说,名称和类代码一起是球员的唯一标识符。在另一个类中同名的人不是同一个人

因此,您只需跟踪类代码、名称元组作为player_统计字典的键:

from collections import deque

#setting up a dictionary so that only the recent most recent values are stored
player_stats = {}
with open("players.dat") as f:
    for line in f:
        classcode, name, score = line.split()
        player_stats.setdefault(classcode, name, deque(maxlen=3))  
        player_stats[name].append(int(score))       

print(player_stats)
from collections import deque

#setting up a dictionary so that only the recent most recent values are stored
player_stats = {}
with open("players.dat") as f:
    for line in f:
        classcode, name, score = line.split()
        key, score = (classcode, name), int(score)
        player_stats.setdefault(key, deque(maxlen=3)).append(score)

print(player_stats)

这将跟踪每个classcode+姓名组合的最后三个分数。

您的第一个选项将为所有玩家提供所有分数。我只需要每个球员最近的三分。您的第二个选项抛出错误:向player_stats=defaultdictdefaultdictlambda:deque TypeError中的dictionary test.py第13行添加值:第一个参数必须是callablemy appologies,在我把lambdas放在正确的位置之前,我粘贴了一些旧的例子。是的,这很有效,谢谢,我已经测试了平均值、总数和最大值,这也很有效。谢谢,我们终于到了。我最初试图将最后三个值放入类而不是字典中,但没有成功。有没有一种方法可以做到这一点,但是通过一门课?在这里,一门课不会给你买任何东西。