在 Python 中对二维字典进行排序

Sorting 2D Dictionaries In Python

使用 Python 非常生疏,我希望按如下方式排序和打印二维数组。使用 studentName 和 studentScore 填充 2D 字典。循环并将新项目添加到字典中。我添加了一个 studentName 和 studentScore 作为示例。我想按 studentName 对数据集进行排序和打印...但不确定如何进行。一如既往地感谢任何帮助...

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])

首先,您应该使用 .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)

你应该复习一下python中字典的用法...你的问题可以这样解决:

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)

这是另一种可能的解决方案,它先按名称排序,然后再按分数排序。正如建议的那样,将您的分数存储为整数会更有意义,因为这会使排序更容易一些。

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%