Python - 按绝对值排序字典

3

我有一个这样定义的字典:

dict: {'KEY1': Decimal('-6.20000'), 'KEY2': Decimal('-2.58000'), 'KEY3': Decimal('6.80000')}

我希望得到一个按绝对值排序的键值对列表或OrderedDict。

我尝试了:

sorted_dict = sorted(mydict, key=lambda k: abs(mydict[k]), reverse=True)

但这只返回键的列表,没有相应的值,虽然它们似乎按绝对值排序。

我该如何获取一个OrderedDict或包含键和值的元组列表,同时按绝对值排序?


sorted((abs(k), v) for k, v in d.items(), reverse=True) 是一种方法。 - Patrick Haugh
我遇到了一个错误: sorted_dict = sorted((abs(k), v) for k, v in dict.items(), reverse=True) ^ SyntaxError: 如果不是唯一的参数,则生成器表达式必须加括号 - Vincent L
当我将其更改为sorted_dict = sorted(((abs(k), v) for k, v in dict.items()), reverse=True)时,我会收到另一个错误:交易循环错误:(<class 'TypeError' >,TypeError("abs()的操作数类型不正确:'str'",),<traceback object at 0x000001466D7DCE08>) - Vincent L
我的错,尝试使用sorted((abs(v), k) for k, v in d.items(), reverse=True) - Patrick Haugh
这使我得到了一个由键和绝对值项组成的元组列表。我想要的是一个包含原始值(包括负数)但按绝对值排序的列表。它还提供了一个由值第一和键第二构成的元组列表,而这并不是期望的结果。 - Vincent L
2个回答

2

你走在正确的道路上。使用 .items 并将结果元组对传递到 OrderedDict 构造函数中。

from collections import OrderedDict

values = {
    'KEY1': Decimal('-6.20000'),
    'KEY2': Decimal('-2.58000'),
    'KEY3': Decimal('6.80000')
}

sorted_pairs = sorted(values.items(), key=lambda k: abs(k[1]), reverse=True)
ordered_dict = OrderedDict(sorted_pairs)

1
谢谢。这个回答和PM 2Ring的一样。我看到它们是在差不多同一时间发布的,所以我猜你还没有看到他的回答。我已经接受了他的回答,但还是感谢你的建议 :) - Vincent L
从技术上讲,时间戳显示我的帖子比你早大约半个小时...但无论如何,我很高兴你得到了答案 :) - Shadow
1
当然,我不知道为什么错过了它!把你的答案标记为正确答案 :) - Vincent L

2

您只需要一个关键函数,该函数从字典.items()视图接收(key, value)元组,并返回该值的绝对值。例如:

from decimal import Decimal
from collections import OrderedDict

data = {'KEY1': Decimal('-6.20000'), 'KEY2': Decimal('-2.58000'), 'KEY3': Decimal('6.80000')} 
out = OrderedDict(sorted(data.items(), key=lambda t: abs(t[1])))
print(out)

输出

OrderedDict([('KEY2', Decimal('-2.58000')), ('KEY1', Decimal('-6.20000')), ('KEY3', Decimal('6.80000'))])

如果我们使用一个适当的def函数作为关键函数,那么阅读起来会更容易:

def keyfunc(t):
    return abs(t[1])

out = OrderedDict(sorted(data.items(), key=keyfunc))

很完美,谢谢!起初我以为OrderedDict的转换搞乱了顺序,但这只是Eclipse调试器显示的方式——它通过键名重新排序字典条目...将其打印到控制台输出上会显示正确的顺序。 - Vincent L
@VincentL 啊!是的,有几个集成开发环境(IDE)在显示字典时会“贴心地”按键进行排序。但你会认为它们应该足够聪明,不会对OrderedDict进行排序... - PM 2Ring
@VincentL 另外,看一下在**kwargs中使用OrderedDict - PM 2Ring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接