【问题标题】:Sorting a dictionary by value with tuples as values以元组为值按值对字典进行排序
【发布时间】:2021-04-05 13:40:44
【问题描述】:

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

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

【问题讨论】:

  • “使用两个值排序”到底是什么意思?按第一个排序,然后按第二个排序?
  • 是的,要求实际上是选择两个浮动字段的最大值的前10条记录
  • 提交我的答案后,我不确定您的上述评论是什么意思。你能提供一个你想要的输出的例子吗?
  • 所以你想按元组的最大值排序?
  • 我添加了一个示例,但我不确定应如何对预期输出中的前两行进行排序。每当第二个浮点数位置有两位数时,排序就会混淆。在帖子中也添加了此类混淆的示例。

标签: python python-3.x sorting dictionary


【解决方案1】:

items-方法返回一个包含键/值对的元组的可迭代对象。这个迭代应该通过评估每个元组中的第二个元素(索引 1)来排序,即每个 dict-element 的值。下面使用内置函数sortedkey 参数,其值为operator.itemgetter(1)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)

我推荐第一种方式,不过因为itemgetter is faster than the lambda-function

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

请注意how tuples are compared:

支持顺序比较的集合的顺序与其第一个不相等的元素相同(例如,[1,2,x]

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多