猿问

在Python中枚举按两个字段排序的列表

我有一个这样的数组:

字段 4 是 1,2,3 的平均值,字段 5 是 1,2,3 的最小值。


[['name0', 24, 19, 25, 22.67, 19],

 ['name1', 25, 19, 25, 23.0, 19],

 ['name2', 25, 19, 25, 23.0, 19],

 ['name3', 24, 22, 23, 23.0, 22],

 ['name4', 27, 19, 25, 23.67, 19],

 ['name5', 27, 19, 25, 23.67, 19],

 ['name6', 28, 19, 26, 24.33, 19],

 ['name7', 28, 19, 26, 24.33, 19],

 ['name8', 28, 19, 26, 24.33, 19],

 ['name9', 26, 22, 27, 25.0, 22],

 ['name10', 27, 23, 25, 25.0, 23],

 ['name11', 30, 19, 27, 25.33, 19],

 ['name12', 24, 31, 28, 27.67, 24],

 ['name13', 28, 27, 28, 27.67, 27],

 ['name14', 27, 29, 27, 27.67, 27],

 ['name15', 29, 26, 29, 28.0, 26],

 ['name16', 29, 26, 30, 28.33, 26],

 ['name17', 30, 31, 26, 29.0, 26],

 ['name18', 33, 27, 30, 30.0, 27],

 ['name19', 29, 31, 30, 30.0, 29],

 ['name20', 30, 36, 31, 32.33, 30],

 ['name21', 36, 30, 32, 32.67, 30],

 ['name22', 38, 33, 36, 35.67, 33],

 ['name23', 30, 27, 99, 52.0, 27],

 ['name24', 99, 27, 32, 52.67, 27],

 ['name25', 37, 99, 36, 57.33, 36]]

其中已按字段 4 排序,然后按字段 5 排序。

我希望枚举此列表,创建一种“排名”或“讲台”。


enumerate()不起作用,因为如您所见,某些字段与字段 4 和 5 相关联,因此它们的“排名”应该相同。

例如,第一个值应如下所示:


[['1', 'name0', 24, 19, 25, 22.67, 19],

 ['2', 'name1', 25, 19, 25, 23.0, 19],

 ['2', 'name2', 25, 19, 25, 23.0, 19],

 ['3', 'name3', 24, 22, 23, 23.0, 22],

 ['4', 'name4', 27, 19, 25, 23.67, 19],

 ...]

无法找到一种干净的方法来解决这个问题。谢谢您的帮助。


POPMUISE
浏览 185回答 3
3回答

守着星空守着你

假设列表已排序,您可以使用 ... 恰当命名的groupby, 和 ,按第 4 和第 5 个元素对子列表进行分组itemgetter。enumerate在由 返回的迭代器上使用groupby:from itertools import groupbyfrom operator import itemgetter# data = [['name0', ...[ [str(i+1)] + l for i, (k, g) in enumerate(groupby(data, key=itemgetter(4, 5))) for l in g ]输出:[    ['1', 'name0', 24, 19, 25, 22.67, 19],    ['2', 'name1', 25, 19, 25, 23.0, 19],    ['2', 'name2', 25, 19, 25, 23.0, 19],    ['3', 'name3', 24, 22, 23, 23.0, 22],    ['4', 'name4', 27, 19, 25, 23.67, 19],    ['4', 'name5', 27, 19, 25, 23.67, 19],    ['5', 'name6', 28, 19, 26, 24.33, 19],    ['5', 'name7', 28, 19, 26, 24.33, 19],    ['5', 'name8', 28, 19, 26, 24.33, 19],    ['6', 'name9', 26, 22, 27, 25.0, 22],    ['7', 'name10', 27, 23, 25, 25.0, 23],    ['8', 'name11', 30, 19, 27, 25.33, 19],    ['9', 'name12', 24, 31, 28, 27.67, 24],    ['10', 'name13', 28, 27, 28, 27.67, 27],    ['10', 'name14', 27, 29, 27, 27.67, 27],    ['11', 'name15', 29, 26, 29, 28.0, 26],    ['12', 'name16', 29, 26, 30, 28.33, 26],    ['13', 'name17', 30, 31, 26, 29.0, 26],    ['14', 'name18', 33, 27, 30, 30.0, 27],    ['15', 'name19', 29, 31, 30, 30.0, 29],    ['16', 'name20', 30, 36, 31, 32.33, 30],    ['17', 'name21', 36, 30, 32, 32.67, 30],    ['18', 'name22', 38, 33, 36, 35.67, 33],    ['19', 'name23', 30, 27, 99, 52.0, 27],    ['20', 'name24', 99, 27, 32, 52.67, 27],    ['21', 'name25', 37, 99, 36, 57.33, 36]]

繁星coding

从i = 1它们开始并遍历它们并分配等级,只有i += 1在下一行不同时才递增。

跃然一笑

使用Pandas和dense rank:import pandas as pddf = pd.DataFrame(data = [['name0', 24, 19, 25, 22.67, 19], ['name1', 25, 19, 25, 23.0, 19], ['name2', 25, 19, 25, 23.0, 19], ['name3', 24, 22, 23, 23.0, 22], ['name4', 27, 19, 25, 23.67, 19], ['name5', 27, 19, 25, 23.67, 19], ['name6', 28, 19, 26, 24.33, 19], ['name7', 28, 19, 26, 24.33, 19], ['name8', 28, 19, 26, 24.33, 19], ['name9', 26, 22, 27, 25.0, 22], ['name10', 27, 23, 25, 25.0, 23], ['name11', 30, 19, 27, 25.33, 19], ['name12', 24, 31, 28, 27.67, 24], ['name13', 28, 27, 28, 27.67, 27], ['name14', 27, 29, 27, 27.67, 27], ['name15', 29, 26, 29, 28.0, 26], ['name16', 29, 26, 30, 28.33, 26], ['name17', 30, 31, 26, 29.0, 26], ['name18', 33, 27, 30, 30.0, 27], ['name19', 29, 31, 30, 30.0, 29], ['name20', 30, 36, 31, 32.33, 30], ['name21', 36, 30, 32, 32.67, 30], ['name22', 38, 33, 36, 35.67, 33], ['name23', 30, 27, 99, 52.0, 27], ['name24', 99, 27, 32, 52.67, 27], ['name25', 37, 99, 36, 57.33, 36]], columns= ['1', '2', '3', '4', '5', '6'])df["rank"] = df['5'].rank(method = "dense")df>    1   2   3   4   5   6   rank0   name0   24  19  25  22.67   19  1.01   name1   25  19  25  23.00   19  2.02   name2   25  19  25  23.00   19  2.03   name3   24  22  23  23.00   22  2.04   name4   27  19  25  23.67   19  3.05   name5   27  19  25  23.67   19  3.06   name6   28  19  26  24.33   19  4.07   name7   28  19  26  24.33   19  4.08   name8   28  19  26  24.33   19  4.09   name9   26  22  27  25.00   22  5.010  name10  27  23  25  25.00   23  5.011  name11  30  19  27  25.33   19  6.012  name12  24  31  28  27.67   24  7.013  name13  28  27  28  27.67   27  7.014  name14  27  29  27  27.67   27  7.015  name15  29  26  29  28.00   26  8.016  name16  29  26  30  28.33   26  9.017  name17  30  31  26  29.00   26  10.018  name18  33  27  30  30.00   27  11.019  name19  29  31  30  30.00   29  11.020  name20  30  36  31  32.33   30  12.021  name21  36  30  32  32.67   30  13.022  name22  38  33  36  35.67   33  14.023  name23  30  27  99  52.00   27  15.024  name24  99  27  32  52.67   27  16.025  name25  37  99  36  57.33   36  17.0如果您想要列表列表 -df = df.set_index('rank').reset_index()df.values.tolist()
随时随地看视频慕课网APP

相关分类

Python
我要回答