2015-11-20 80 views
0

對Python非常生疏,我希望按如下方式對2D數組進行排序和打印。用studentName和studentScore填充2D字典。循環播放並向字典中添加新項目。我已經添加了studentName和studentScore作爲示例。我想按studentName排序和打印dataSet ...但不確定如何。任何幫助表示讚賞一如既往...在Python中對2D字典進行排序

dataSet = {} 
position = len(dataSet) 
studentName = "Derek" 
studentScore = "80%" 
dataSet.update({position : {"studentName": studentName, "Score": studentScore }}) 

我想輸出是這樣的......

Student: Derek -- Score: 80% 

,自然,通過每個項目在數據集中

目前使用這...但被格式化爲對象,而且非常難看!

def viewScores(dataSet): 
for x in dataSet: 
    for y in dataSet[x]: 
     print (y,':',dataSet[x][y]) 
+0

你可能是一點點清晰,你可以給樣品的輸入和輸出 – The6thSense

+0

你可以看一下許多相關的問題 - 答案已經在那了。 – OBu

+0

那麼在什麼樣的方式應該排序給它多於一個數據的例子 – The6thSense

回答

1

應該檢查詞典的使用在蟒蛇...您的問題是可以解決這樣的:

def viewScores(dataSet): 
for student in sorted(dataSet.keys()): 
    print ("{}: {}".format(student, dataSet[student])) 


dataSet = {} 
studentName = "Derek" 
studentScore = "80%" 
dataSet[studentName] = studentScore 
dataSet["Zyline"] = "99%" 

print(dataSet) # just to show it works (and it might be sorted in reverse order) 

viewScores(dataSet) 

此外,我會建議將比分存儲爲數字而不是字符串,並僅在印刷品中添加百分比符號。

有了新的要求(重名),我會解決這個問題是這樣的:

def viewScores(dataSet): 
    for student in sorted(dataSet, key=lambda x: x["studentName"]): 
     print ("Student: {} -- Score {}%".format(student["studentName"], student["studentScore"])) 


dataSet = [] 
studentID = 7 
studentName = "Derek" 
studentScore = 80 
dataSet.append({"studentName": studentName, "studentScore": studentScore, "id": studentID}) 
dataSet.append({"studentName": "Zyline", "studentScore": 99, "id": 42}) 

print(dataSet) # just to show it works (and it might be sorted in reverse order) 

viewScores(dataSet) 
+0

我真的展現出我的生鏽。謝謝OBU。我看到的唯一問題是兩個「學生」有相同的名字? –

+0

那麼「學生」是字典的一個不好的關鍵。你可以引入一個id,或者只是使用一個元組列表 – OBu

0

首先,您應該使用.values()來獲得您的字典值。

然後,您可以輕鬆地訪問每個人studentNamestudentScore。我用list comprehension

最後,使用sorted()對值進行排序。

valuesDict = dataSet.values() 
valuesTuple = [(v["studentName"], v["Score"]) for v in valuesDict] 
sortedValues = sorted(valuesTuple) 

for student, score in sortedValues: 
    print "Student: %s -- Score: %s" % (student, score) 
+0

完美。很乾淨! –

+0

列表解析是不需要的,你可以迭代鍵。 – OBu

+0

@OBu我不能迭代鍵,因爲鍵是整數,相應的值是字典。這就是爲什麼我使用列表理解...我不明白爲什麼它值得downvote。 – Delgan

1

這裏是另一種可能的解決方案,它通過排序名稱,然後得分。正如所建議的那樣,將分數存儲爲整數會更有意義,因爲這樣會使分類更容易一些。

def viewScores(dataSet): 
    entries = sorted([(dataSet[entry]['studentName'], dataSet[entry]['Score']) for entry in dataSet]) 

    for name, score in entries: 
     print('Student: {} -- Score: {}%'.format(name, score)) 

dataSet = {} 
position = len(dataSet) 
studentName = "Derek" 
studentScore = 80 
dataSet.update({position : {"studentName": studentName, "Score": studentScore }}) 

position = len(dataSet) 
studentName = "Andrew" 
studentScore = 90 

dataSet.update({position : {"studentName": studentName, "Score": studentScore }}) 
position = len(dataSet) 
studentName = "Andrew" 
studentScore = 9 
dataSet.update({position : {"studentName": studentName, "Score": studentScore }}) 

viewScores(dataSet) 

在這個例子中它會顯示以下的輸出:

Student: Andrew -- Score: 9% 
Student: Andrew -- Score: 90% 
Student: Derek -- Score: 80% 
相關問題