以元组作为值按值对字典排序

2024-05-28 12:50:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本结构如下的词典:

Key   = A tuple containing two strings
Value = A tuple containing two float values

我想使用这两个值对这本词典进行排序

要求为两个浮点字段选择最大值的前10个记录

有可能吗

请在字典中找到以下数据示例:

{"(12144, 'DBI 3900288')(62232, 'DBI 9503371')": (0.2978723404255319, 56),
 "(62232, 'DBI 9503371')(12144, 'DBI 3900288')": (0.45153846153846154, 56),
 "(89121, 'USB 7812')(908121, 'USB 3182')": (0.45, 6),
 "(908121, 'USB 3182')(20629, 'FORT 11156')": (0.8, 8),
 "(908121, 'USB 3182')(20630, 'FORT 11158')": (0.9, 9),
 "(908121, 'USB 3182')(20632, 'FORT 11164')": (0.45, 6),
 "(908121, 'USB 3182')(20666, 'FORT 1234TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20667, 'FORT 1236TOB')": (0.45, 6),
 "(908121, 'USB 3182')(20669, 'FORT 1240TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20674, 'FORT 1252TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20675, 'FORT 1258TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20684, 'FORT 13408A')": (0.7, 7),
 "(908121, 'USB 3182')(20685, 'FORT 13410A')": (0.7, 7),
 "(908121, 'USB 3182')(20686, 'FORT 13412A')": (0.45, 6),
 "(908121, 'USB 3182')(20687, 'FORT 13415A')": (0.45, 6),
 "(908121, 'USB 3182')(20688, 'FORT 13418A')": (0.45, 6),
 "(908121, 'USB 3182')(20689, 'FORT 13424A')": (0.45, 6),
 "(908121, 'USB 3182')(20711, 'FORT 16-630')": (0.8, 8),
 "(908121, 'USB 3182')(20712, 'FORT 16-632')": (0.7, 7),
 "(908121, 'USB 3182')(20713, 'FORT 16-634')": (0.45, 6),
 "(908121, 'USB 3182')(20714, 'FORT 16-636')": (0.7, 7),
 "(908121, 'USB 3182')(20716, 'FORT 16-640')": (0.8, 8),
 "(908121, 'USB 3182')(20972, 'FORT 39002')": (0.9, 9),
 "(908121, 'USB 3182')(20985, 'FORT 39652')": (0.8, 8),
 "(908121, 'USB 3182')(20987, 'FORT 39658')": (0.7, 7),
 "(908121, 'USB 3182')(20992, 'FORT 39670')": (0.7, 7),
 "(908121, 'USB 3182')(20993, 'FORT 39672')": (0.45, 6),
 "(908121, 'USB 3182')(20995, 'FORT 39676')": (0.7, 7),
 "(908121, 'USB 3182')(20996, 'FORT 39682')": (0.7, 7),
 "(908121, 'USB 3182')(20999, 'FORT 39688')": (0.45, 6) }

预期产出:

{

 "(908121, 'USB 3182')(20630, 'FORT 11158')": (0.9, 9),
 "(908121, 'USB 3182')(20972, 'FORT 39002')": (0.9, 9),
 "(908121, 'USB 3182')(20629, 'FORT 11156')": (0.8, 8),
 "(908121, 'USB 3182')(20666, 'FORT 1234TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20669, 'FORT 1240TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20674, 'FORT 1252TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20675, 'FORT 1258TOB')": (0.8, 8),
 "(908121, 'USB 3182')(20711, 'FORT 16-630')": (0.8, 8),
 "(908121, 'USB 3182')(20716, 'FORT 16-640')": (0.8, 8),
 "(908121, 'USB 3182')(20985, 'FORT 39652')": (0.8, 8),
 "(908121, 'USB 3182')(20684, 'FORT 13408A')": (0.7, 7),
 "(908121, 'USB 3182')(20685, 'FORT 13410A')": (0.7, 7),
 "(908121, 'USB 3182')(20712, 'FORT 16-632')": (0.7, 7),
 "(908121, 'USB 3182')(20714, 'FORT 16-636')": (0.7, 7),
 "(908121, 'USB 3182')(20995, 'FORT 39676')": (0.7, 7),
 "(908121, 'USB 3182')(20996, 'FORT 39682')": (0.7, 7),
 "(908121, 'USB 3182')(20987, 'FORT 39658')": (0.7, 7),
 "(908121, 'USB 3182')(20992, 'FORT 39670')": (0.7, 7), 
"(62232, 'DBI 9503371')(12144, 'DBI 3900288')": (0.45153846153846154, 56),
 "(908121, 'USB 3182')(20632, 'FORT 11164')": (0.45, 6),
 "(89121, 'USB 7812')(908121, 'USB 3182')": (0.45, 6),
 "(908121, 'USB 3182')(20667, 'FORT 1236TOB')": (0.45, 6),
 "(908121, 'USB 3182')(20686, 'FORT 13412A')": (0.45, 6),
 "(908121, 'USB 3182')(20687, 'FORT 13415A')": (0.45, 6),
 "(908121, 'USB 3182')(20688, 'FORT 13418A')": (0.45, 6),
 "(908121, 'USB 3182')(20689, 'FORT 13424A')": (0.45, 6),
 "(908121, 'USB 3182')(20713, 'FORT 16-634')": (0.45, 6),
 "(908121, 'USB 3182')(20999, 'FORT 39688')": (0.45, 6),
 "(908121, 'USB 3182')(20993, 'FORT 39672')": (0.45, 6)
 "(12144, 'DBI 3900288')(62232, 'DBI 9503371')": (0.2978723404255319, 56),
 }

当对元组的浮点值使用排序方法时。当元组中的第二个浮点值是两位数时,排序顺序有时会混淆。例如,在下面所示的示例中,第一个浮点数的排序完全按照desc顺序进行,但第二个浮点数排序不正确,如8<;十五

 "(12423, 'LACT 1281')(14961, 'OSI 76214')": (0.8888888888888888, 8),
 "(12423, 'LACT 1281')(15328, 'PER 58835')": (0.8888888888888888, 8),
 "(12423, 'LACT 1281')(16902, 'RAP NRT16')": (0.8888888888888888, 8),
 "(18154, 'TGIS 804176-01')(18139, 'TGIS 57264-00')": (0.8823529411764706, 15),
 "(3034, 'TIME 08121')(2926, 'TIME 15677')": (0.8823529411764706, 15),
 "(3034, 'TIME 08121')(2927, 'TIME 16424')": (0.8823529411764706, 15),

Tags: 示例time排序顺序usb浮点元组浮点数
1条回答
网友
1楼 · 发布于 2024-05-28 12:50:44

^{}-方法返回一个iterable,其中元组包含键/值对。应通过评估每个元组中的第二个元素(索引1),即每个dict元素的值,对该iterable进行排序。下面使用值为^{}的内置函数^{}key参数operator.itemgetter(1)返回一个可调用项,该可调用项从其参数中获取索引1处的项。对iterable进行排序后,我们可以从中构造dict:

from operator import itemgetter
ordered = sorted(data.items(), key=itemgetter(1))
dict(ordered)

不使用itemgetter也可以通过使用lambda-函数获取索引1处的项来实现这一点:

ordered = sorted(data.items(), key=lambda x: x[1])
dict(ordered)

不过,我推荐第一种方法,因为^{} is faster than the ^{}-function

如果要从高到低排序,请使用排序函数的反向参数:sorted(..., reverse=True)

请注意how tuples are compared

Collections that support order comparison are ordered the same as their first unequal elements (for example, [1,2,x] <= [1,2,y] has the same value as x <= y).

相关问题 更多 >

    热门问题