【问题标题】:Get the most currently dated subset of data from a Python dict with multiple dated dicts within从包含多个日期字典的 Python 字典中获取最新日期的数据子集
【发布时间】:2018-04-09 00:26:48
【问题描述】:

在 Python 中,是否有一种好方法(以编程方式)从存在最近日期的数据子集中获取 ["win"]["amount"] 的值?

为了提供一个更具体的例子来说明我的问题,我想从 2018 年 4 月 2 日起将winamount (2018-04-02) 改为199.51

这是源 JSON(我使用 json.loads 将其转换为 Python dict):

{
    "numbers": [{
        "lose": {
            "amount": "122.50"
        },
        "win": {
            "amount": "232.50"
        },
        "date": "2018-01-08"
    }, {
        "lose": {
            "amount": "233.75"
        },
        "win": {
            "amount": "216.25"
        },
        "date": "2018-03-05"
    }, {
        "lose": {
            "amount": "123.50"
        },
        "win": {
            "amount": "543.00"
        },
        "date": "2018-03-12"
    }, {
        "lose": {
            "amount": "213.31"
        },
        "win": {
            "amount": "253.33"
        },
        "date": "2018-03-19"
    }, {
        "lose": {
            "amount": "217.00"
        },
        "win": {
            "amount": "199.51"
        },
        "date": "2018-04-02"
    }]
}

这似乎是一个非常简单的解决方案,但我无法完全确定该解决方案是什么,或者是否有 Pythonic 的方式来完成此操作。我确实编写了一些逻辑来计算最大日期,方法是将所有日期放入名为datelist 的列表中并执行max(datelist),但我不确定如何将其关联起来以获取["amount"]["win"]

【问题讨论】:

  • 你能证明自己任何努力解决这个问题吗?
  • 我将客观地回答这个问题:是的,当我将日期放入datelist 并使用max() 计算最近的日期时,如上所述。但是,我不完全确定如何将该计算与我想要得到的 amount 联系起来。我在想最好的办法是以某种方式按值而不是键搜索dict。我尝试过这样的事情,但无济于事(我认为因为日期在winlose 的“外部”)stackoverflow.com/questions/8023306/…
  • @juanpa-arrivillaga (stackoverflow.com/a/49724192/9616920) 的解决方案在这里为我工作。

标签: python date dictionary nested max


【解决方案1】:

如果'date' 属性遵循 ISO 8601,因此字典顺序对应于时间顺序,那么您可以简单地将 max 与适当的 key 一起使用,因此:

In [12]: max(data['numbers'], key=lambda d:d['date'])['win']['amount']
Out[12]: '199.51'

【讨论】:

  • 这行得通。谢谢你。看来我需要复习匿名 lambda 函数了。
  • @stuntmachine 您可以轻松使用普通功能
  • 如果我理解正确的话,这个匿名函数会返回与最大日期共享的数据子集,然后就像从该结果中选择 ['win']['amount'] 一样简单。非常好。
【解决方案2】:

鉴于您的日期采用 ISO 8601 表示法,您可以将简单的字符串比较作为内部 numbers 列表的排序机制,然后选择最后一个元素:

import operator

oldest = sorted(your_data["numbers"], key=operator.itemgetter("date"))[0]["win"]["amount"]
# 232.50
newest = sorted(your_data["numbers"], key=operator.itemgetter("date"))[-1]["win"]["amount"]
# 199.51

或者,如果您需要更频繁地访问它们,或者只需对内部列表进行一次排序,然后选择您想要的任何元素。

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2022-11-27
    • 2023-01-30
    • 2019-07-29
    • 1970-01-01
    • 2021-01-05
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多