【问题标题】:Sort data based on key of a list of multiple dictionaries根据多个字典列表的键对数据进行排序
【发布时间】:2017-09-19 07:54:57
【问题描述】:

我有一个这样的列表

li = [
    {1: {'amount': 255, 'date': '25-02-2017'}},
    {2: {'amount': 25, 'date': '2-02-2017'}},
    {3: {'amount': 38, 'date': '20-02-2017'}},
]

我正在尝试根据'amount' 对数据进行升序和降序排序。

我尝试了以下方法,但无法获得我想要的结果:

import operator
li.sort(key=operator.itemgetter('amount'))

from operator import itemgetter
newlist = sorted(li, key=itemgetter('amount'))

两者都引发异常KeyError: 'amount'

【问题讨论】:

  • 那是因为列表项是dicts的dicts

标签: python python-2.7 sorting dictionary


【解决方案1】:

您有一个带有单个键的字典列表,其值是另一个字典。正是那个 nested 字典具有键 'amount'

你必须伸手去拿那个单一的价值:

newlist = sorted(li, key=lambda d: d.values()[0]['amount'])

这仅适用于 Python 2,其中 d.values() 是一个列表。在 Python 3 中,您必须改用 next(iter(d.values())['amount']

最好不要生成嵌套结构。可能将这些编号的键移到另一个键值对中:

li = [
    {'id': 1', amount': 255, 'date': '25-02-2017'},
    {'id': 2, 'amount': 25, 'date': '2-02-2017'},
    {'id': 3, 'amount': 38, 'date': '20-02-2017'},
]

此时您的原始尝试会奏效。您可以使用[dict(id=d.keys()[0], **d.values()[0]) for d in li] 转换您当前的数据结构,但最好修复生成列表的代码。

【讨论】:

  • 所以我目前没有达到第二个字典
【解决方案2】:

尝试以下使用 lambdas 的代码,

li=[{1:{'amount':255,'date':'25-02-2017'}},{2:{'amount':25,'date':'2-02-2017'}},{3:{'amount':38,'date':'20-02-2017'}}] 
print(li)

li.sort(key=lambda x:list(x.values())[0]['amount']) # ascending
print(li)

li.sort(key=lambda x:list(x.values())[0]['amount'],reverse=True) # descending
print(li)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多