【问题标题】:Python sort list of dictionariesPython排序字​​典列表
【发布时间】:2018-09-25 22:54:33
【问题描述】:

我有一个字典列表:

AccountValues = [
{'portfolio_ref': 1, 'tag': 'FullInit', 'value': '20642.95', 'currency': 'USD', 'percent': 0.0}, 
{'portfolio_ref': 1, 'tag': 'FullMaint', 'value': '21350.54', 'currency': 'USD', 'percent': 0.0}, 
{'portfolio_ref': 1, 'tag': 'NetLiq', 'value': '70976.05', 'currency': 'USD', 'percent': 100.0} ]

每个 SQL 描述的简单任务:按portfolio_ref ASC 排序,百分比DESC

我尝试失败的方法:

sorted(AccountsValues, key=lambda x: (x[1],-x[4]))

这给了我

KeyError: 1

第二次尝试:

import operator
result = sorted(myAccountsValues, key=itemgetter('percent'))

无法按百分比排序。

【问题讨论】:

  • 您尝试的方法不起作用怎么办?弄清楚你尝试了什么、你期望什么以及你得到了什么总是有帮助的。例如,您是否收到错误消息?还是只是错误的结果?您是否尝试过调试?
  • 您的第二次尝试似乎不起作用的原因是您的数据已经按百分比排序...

标签: python list sorting dictionary


【解决方案1】:

您可以使用dict.__getitem__ 或其语法糖[]

res = sorted(AccountValues, key=lambda x: (x['portfolio_ref'], -x['percent']))

请记住,字典不能按整数索引。从历史上看(3.6 之前),它们甚至没有被订购。即使在 Python 3.7 中,也不能直接提取第 n 个键或值。

结果:

print(res)

[{'portfolio_ref': 1, 'tag': 'NetLiq', 'value': '70976.05', 'currency': 'USD', 'percent': 100.0},
 {'portfolio_ref': 1, 'tag': 'FullInit', 'value': '20642.95', 'currency': 'USD', 'percent': 0.0},
 {'portfolio_ref': 1, 'tag': 'FullMaint', 'value': '21350.54', 'currency': 'USD', 'percent': 0.0}]

【讨论】:

    【解决方案2】:

    您只需将您正确完成的所有事情组合起来:将键排序为元组引用dict条目的正确方法:

    >>> sorted(AccountValues, key=lambda x: (x["portfolio_ref"], -x["percent"]))
    [{'tag': 'NetLiq', 'portfolio_ref': 1, 'value': '70976.05', 'percent': 100.0, 'currency': 'USD'},
     {'tag': 'FullInit', 'portfolio_ref': 1, 'value': '20642.95', 'percent': 0.0, 'currency': 'USD'},
     {'tag': 'FullMaint', 'portfolio_ref': 1, 'value': '21350.54', 'percent': 0.0, 'currency': 'USD'}]
    

    更好的是,使用

    sorted(AccountValues, key=itemgetter("portfolio_ref", "percent"))
    

    您的第一次尝试失败了,因为 x[1]x[4] 不是对字典的有效引用:您必须使用您最初提供的标签,而不是相对位置。

    您的第二次尝试是有缺陷的,只是因为您没有辅助排序键。

    【讨论】:

    • 当我粘贴时,还要注意@jpp 发布了相同的回复,gj 到了两者
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多