附加到循环中的字典值列表

时间:2019-02-27 17:59:22

标签: python

我有一些代码,其中使用了名称列表,以及一个文件(最终是多个文件)结果(团队,名称,地点)。我寻找的最终结果是让每个人的名字(键)与一个点(值)列表相关联。但是,当我使用下面的代码时,最终得到的结果是

“安倍”:[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]]=[]

在倒数第二行之前,但是我认为这最终使我无法将多个乐谱附加到每个键上(因为我正在循环内重新初始化)。对我的错误有任何见解将不胜感激。

3 个答案:

答案 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

或使用collections.defaultdict

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)