[英]Dictionaries and files in python
大家好,第一次問這里。
我試圖弄清楚如何創建一個包含鍵作為ID的字典,以及如何將值作為另一個包含該個人ID的家庭作業論文和考試分數的字典的值。
例:
{"173-25-6389":
{
"hw":[94,89,92,73],
"quiz":[45,36,42,50,22,27,40,41],
"exam":[135,127]
},
.....
}
這些數字是從代表類別的單獨文件中提取的,每個文件都與它們對應的ID相匹配。
我有4個文件可以使用,其中一個僅包含ID,我認為我將把它們應用於較大詞典中的鍵。
我的主要問題是在文件內部,每一行的編寫方式如下:
173-25-6389 61
因此,它是id
加上space
,然后是score
。 我不確定如何遍歷文件並搜索具有相同ID的其他樂譜。
關於如何找到分數列表,然后將其添加到字典中作為包含ID的較大字典的值,我有點困惑。 任何關於如何做到這一點的見解都將是驚人的,如果您需要我詳細說明,請告訴我。
我只編碼了大約一年,所以對我輕松一點。 謝謝
因此,假設您已經知道如何打開文件並逐行讀取它。 每行都有一個ID和一個分數,但是您不知道分數是否已存在於結果字典中。 坦白說,您寧可不在乎。 輸入defaultdict 。 即使特定的鍵不存在,它也可以保證您的有用價值。
from collections import defaultdict
…
result = defaultdict(dict) # an undefined key will map an empty dict
for line in scorefile:
id, score = line.split()
result[id]['hw'] = score
但是,等等,這將用一個分數覆蓋我們的“硬件”鍵! 我們想要一個清單!
讓我們對這個defaultdict加倍。
# an undefined key will map a defaultdict
# whose undefined keys will map an empty list
result = defaultdict(lambda: defaultdict(list))
for line in scorefile:
id, score = line.split()
result[id]['hw'].append(score)
現在,您沒有說我們如何通過考試成績來講述家庭作業,所以我將由您自己決定……
我想到了。 我敢打賭,有一種更加整潔的方式編寫它,甚至使用某種形式的遞歸,我還沒有足夠的經驗來弄清楚它。 但這就是我所得到的,它使我得到了所需的東西。 謝謝您的幫助!
def create_dictionary(idfilename,hwfilename,qzfilename,examfilename):
idread = open(idfilename, 'r')
hwread = open(hwfilename, 'r')
qzread = open(qzfilename, 'r')
examread = open(examfilename, 'r')
dict = {}
dicthw = {}
dictqz = {}
dictexam = {}
for line in idread:
if line not in dict:
dict[line.rstrip('\n')] = {}
for line in hwread:
name, score = line.split()
if name in dicthw:
dicthw[name].append(score)
else:
dicthw[name] = [score]
for line in qzread:
name, score = line.split()
if name in dictqz:
dictqz[name].append(score)
else:
dictqz[name] = [score]
for line in examread:
name, score = line.split()
if name in dictexam:
dictexam[name].append(score)
else:
dictexam[name] = [score]
for k, v in dicthw.items():
if len(v) < 4:
while len(v) < 4:
v.append(0)
if k in dict:
dict[k] = ({'hw':v})
for k, v in dictqz.items():
if len(v) < 8:
while len(v) < 8:
v.append(0)
if k in dict:
qz_update = {'qz':v}
dict[k].update(qz_update)
for k, v in dictexam.items():
if len(v) < 2:
while len(v) < 2:
v.append(0)
if k in dict:
exam_update = {'exam':v}
dict[k].update(exam_update)
return(dict)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.