Python中查找所有数据列表和相关标题的最高值和最低值的最有效算法是什么

Python中查找所有数据列表和相关标题的最高值和最低值的最有效算法是什么,python,list,algorithm,search,Python,List,Algorithm,Search,在我的程序中有多个测验。用户进行测验,然后测验标题和分数保存到数据库中。为了简化示例,我将使用Python列表表示它们: [['quizTitle1', score], ['quizTitle2',score] ['quizTitle1', score] ['quizTitle3', score]] 我正试图打印出用户最差的测验题目 因此,使用Python列表示例,您可以看到用户已经参加了两次测验1。在第二次测验中,他们可能比第一次考得更好。因此,我需要获得用户在每次测验中获得的最高分数(他们

在我的程序中有多个测验。用户进行测验,然后测验标题和分数保存到数据库中。为了简化示例,我将使用Python列表表示它们:

[['quizTitle1', score], ['quizTitle2',score] ['quizTitle1', score] ['quizTitle3', score]]
我正试图打印出用户最差的测验题目

因此,使用Python列表示例,您可以看到用户已经参加了两次测验1。在第二次测验中,他们可能比第一次考得更好。因此,我需要获得用户在每次测验中获得的最高分数(他们的最佳分数)。然后我需要找出哪个测验的分数最低,最好

我当前的计划是这样的(伪代码)

While found=false
1st=我们正在相互比较的第一个选定分数
第二名=我们与第一名进行比较的分数
在列表数量范围内重复的For循环
如果(第二名<第一名)或(第二名与第一名同名且分数大于第一名):
二变一
循环重复
其他:
新的第二名是下一个名单
找到=真

但是最好的方法是什么呢?

您可以使用字典存储每个测验的值,并使用列表中迄今为止看到的最大值更新其值,然后获取字典中所有值的最小值

scores = [['q1', 20],['q2',30],['q1',40],['q2',10],['q2',45],['q1',10]]
d = {}
for s in scores:
  d[s[0]] = s[1] if s[0] not in d else max(d[s[0]], s[1])
print(d)
print("Lowest best : ", min(d.values()))
这张照片是:

{'q1': 40, 'q2': 45}
Lowest best :  40

您可以使用字典存储每个测验的值,并使用列表中迄今为止看到的最大值更新其值,然后获取字典中所有值的最小值

scores = [['q1', 20],['q2',30],['q1',40],['q2',10],['q2',45],['q1',10]]
d = {}
for s in scores:
  d[s[0]] = s[1] if s[0] not in d else max(d[s[0]], s[1])
print(d)
print("Lowest best : ", min(d.values()))
这张照片是:

{'q1': 40, 'q2': 45}
Lowest best :  40
好吧,如果你愿意,那么:

将熊猫作为pd导入
l=[[“quizTitle1”,15],
[“quizTitle2”,25],
[“quizTitle1”,11],
[“quizTitle3”,84],
[“quizTitle2”,24]]
df=pd.DataFrame(l,列=[“测验”,“分数”])
打印(df)
#测验分数
#0 quizTitle1 15
#1 quizTitle2 25
#2 quiztitle11
#3 quizTitle3 84
#4 quizTitle2 24
lovel_score=df.iloc[df.groupby(['quick']).max().reset_index()[“score”].idxmin()]
打印(最低分数)
#小测验
#得分15分
#名称:0,数据类型:对象
如果您愿意,那么:

将熊猫作为pd导入
l=[[“quizTitle1”,15],
[“quizTitle2”,25],
[“quizTitle1”,11],
[“quizTitle3”,84],
[“quizTitle2”,24]]
df=pd.DataFrame(l,列=[“测验”,“分数”])
打印(df)
#测验分数
#0 quizTitle1 15
#1 quizTitle2 25
#2 quiztitle11
#3 quizTitle3 84
#4 quizTitle2 24
lovel_score=df.iloc[df.groupby(['quick']).max().reset_index()[“score”].idxmin()]
打印(最低分数)
#小测验
#得分15分
#名称:0,数据类型:对象

这是使用Python函数的最快方法:

lst = [['quizTitle1', 6], ['quizTitle2', 5], ['quizTitle1', 9], ['quizTitle3', 7]]

sorted_list = sorted(lst, key=lambda x: x[1])

print(f'1st quiz: {sorted_list[-1][0]} | score: {sorted_list[-1][1]}')
print(f'last on quiz: {sorted_list[0][0]} | score: {sorted_list[0][1]}')

基本上,你要求对列表进行排序,然后你要求最后一个值,它是较高的,最后一个值,它是列表中的第一个值。但是,这不是一种算法。

这是使用Python函数的最快方法:

lst = [['quizTitle1', 6], ['quizTitle2', 5], ['quizTitle1', 9], ['quizTitle3', 7]]

sorted_list = sorted(lst, key=lambda x: x[1])

print(f'1st quiz: {sorted_list[-1][0]} | score: {sorted_list[-1][1]}')
print(f'last on quiz: {sorted_list[0][0]} | score: {sorted_list[0][1]}')
基本上,你要求对列表进行排序,然后你要求最后一个值,它是较高的,最后一个值,它是列表中的第一个值。但是,这不是一种算法。

Amap reduce方法:
从itertools导入groupby
分数=[['q1',20],'q2',30],'q1',40],'q2',10],'q2',45],'q1',10]]
分组分数=分组依据(排序(分数),键=lambda l:l[0])
最高_分数=map(λx:max(x[1],key=λx:x[1]),分组_分数)
最低\最高=最低(最高\分数,关键=λx:x[1])
打印(最低/最高)
输出:

['q1', 40]
['q1', 40]
解释 使用的功能包括:

  • sorted
    ()按测验名称对结果排序
  • itertools.groupby
    (),它通过测验对结果进行分组,假设它们已经按测验排序
  • map
    ()将函数应用于列表的每个元素。。。这里有一个列表列表,我们将函数
    max
    应用于每个列表
  • max
    min
    ()
groupby
map
的返回值不是列表,如果您尝试直接打印它们,您将看到一堆无用的
。但是使用
list()
将每个不可打印的对象转换为列表,计算的中间值如下:

得分=[[q1',20],'q2',30],'q1',40],'q2',10],'q2',45],'q1',10]]
分组分数=[
[q1',[q1',10],[q1',20],[q1',40]],
[q2',[q2',10],[q2',30],[q2',45]]
]
最高分=[['q1',40],'q2',45]]
最低的,最高的=['q1',40]
减少 map-reduce算法的最后一步通常是“reduce()”,这是一个函数,它将两个元素进行比较,并用某物替换这两个元素,直到只剩下一个元素。在本例中,我们将寻找最高分数中的最低分数,因此在比较两个元素时,我们希望保持这两个元素中的最小值。但是,我们可以直接对整个序列调用
min()
,而不是使用reduce重复应用
min()
函数

以下是python中的reduce函数及其代码,仅供参考:

  • functools.reduce
    ()连续比较最高的_分数,并只保留最低的分数
从itertools导入groupby
从functools导入reduce
分数=[['q1',20],'q2',30],'q1',40],'q2',10],'q2',45],'q1',10]]
分组分数=分组依据(排序(分数),键=lambda l:l[0])
最高_分数=map(λx:max(x[1],key=λx:x[1]),分组_分数)
最低\最高=降低(λx,y:min([x,y],key=λx:x[1]),最高\分数)
打印(最低/最高)
输出:

['q1', 40]
['q1', 40]
映射减少方法:
从itertools导入groupby
分数=[['q1',20],'q2',30],'q1',40],'q2',10],'q2',45],'q1',10]]
分组分数=分组依据(排序(分数),键=lambda l:l[0])
最高分数=map(lam)