我有一些代码,其中使用了名称列表,以及一个文件(最终是多个文件)结果(团队,名称,地点)。我寻找的最终结果是让每个人的名字(键)与一个点(值)列表相关联。但是,当我使用下面的代码时,最终得到的结果是
“安倍”:[100,80,90],“鲍勃”:[100,80,90],“凸轮”:[100,80,90]代替
“安倍”:[100],“鲍勃”:[80],“凸轮”:[90]
f=open("NamesList.txt","r")
lines=f.read().splitlines() #get names
Scores=dict.fromkeys(lines,[]) #make a dictionary with names as keys, but no values yet
f1=open("ResultsTest.txt","r") #open results file: column1-team, column 2- name, column 3-place
lines=f1.read().splitlines()
A={1:100,2:90,3:80} #points assignment, 100 for 1, 90 for 2, 80 for 3
for l in lines:
a=l.split('\t') #a[0] is team a[1] is name a[2] is place
score=A.get(int(a[2])) #look up points value corresponding to placing
Scores[a[1]].append(score)
我可以通过添加
获得所需的结果 Scores[a[1]]=[]
在倒数第二行之前,但是我认为这最终使我无法将多个乐谱附加到每个键上(因为我正在循环内重新初始化)。对我的错误有任何见解将不胜感激。
答案 0 :(得分:1)
通过使用Scores=dict.fromkeys(lines,[])
,您将使用对同一列表的引用来初始化字典的每个键,因此对列表所做的更改将反映在所有键上。您可以使用dict理解来进行初始化:
Scores = {line: [] for line in lines}
或者,您可以将Scores
初始化为普通字典{}
,并使用dict.setdefault
方法使用列表初始化其键:
Scores.setdefault(a[1], []).append(score)
答案 1 :(得分:0)
您遇到的问题来自创建Scores
的方式:
Scores=dict.fromkeys(lines,[])
使用dict.fromkeys
时,相同值用于字典的所有键。在这里,相同,唯一的空白列表是所有键的通用值。因此,无论您访问哪个键,都始终更新同一列表。
执行Scores[a[1]]=[]
时,实际上创建了一个新的不同的空列表,该列表仅成为键a[1]
的值,因此问题消失了。
您可以使用字典理解来不同地创建字典:
Scores = {key: [] for key in lines} # here, a new empty list is created for each key
from collections import defaultdict
Scores = defaultdict(list)
它将在需要时自动将Score['your_key']
初始化为空列表。
答案 2 :(得分:0)
IIUC,您的字典正在将place
映射到score
。您可以利用defaultdict
来代替fromkeys
方法:
from collections import defaultdict
# Initialize an empty dictionary as you've done with default list entries
scores = defaultdict(list)
# Using the with context manager allows for safe file handling
with open("ResultsTest.txt", 'r') as f1:
lines = f1.read().splitlines()
# Points lookup as you've done before
lookup = {1: 100, 2: 90, 3: 80}
for l in lines:
team, name, place = l.split('\t') # unpacking makes this way more readable
score = lookup.get(int(place))
scores[team].append(score)