【问题标题】:Adding values from list in Python to make total values based on key在 Python 中从列表中添加值以根据键生成总值
【发布时间】:2021-09-21 19:01:37
【问题描述】:

我目前正在为我用 Python 编写的一段特定代码而苦苦挣扎。

我需要根据同一个键获取单独对象值的总值。

这是我目前得到的 JSON 数据

[{
        "name": "John",
        "data": [{
                "currency": "Euro",
                "amount": 100.00
            },
            {
                "currency": "Dollar",
                "amount": 223
            },
            {
                "currency": "Yen",
                "amount": 800
            }
        ]
    },
    {
        "name": "Jack",
        "data": [{
                "currency": "Dollar",
                "amount": 32
            },
            {
                "currency": "Euro",
                "amount": 80
            }
        ]
    },
    {
        "name": "Elise",
        "data": [{
                "currency": "Dollar",
                "amount": 12
            },
            {
                "currency": "Yen",
                "amount": 66
            }
        ]
    }
]

但是!在这个对象数组中,我还想添加另一个对象,其中包含有关每种货币总值的信息。我一直在为此苦苦挣扎,我尝试过嵌套 for 循环,但感觉这是浪费时间,必须有更快的方法......

谁能帮我得到我正在寻找的输出?

想要的输出 =

[{
        "name": "Total",
        "data": [{
            "Euro": {
                "amount": 180
            },
            "Dollar": {
                "amount": 267
            },
            "Yen": {
                "amount": 866
            }
        }]
    },



    {
        "name": "John",
        "data": [{
                "currency": "Euro",
                "amount": 100.00
            },
            {
                "currency": "Dollar",
                "amount": 223
            },
            {
                "currency": "Yen",
                "amount": 800
            }
        ]
    },
    {
        "name": "Jack",
        "data": [{
                "currency": "Dollar",
                "amount": 32
            },
            {
                "currency": "Euro",
                "amount": 80
            }
        ]
    },
    {
        "name": "Elise",
        "data": [{
                "currency": "Dollar",
                "amount": 12
            },
            {
                "currency": "Yen",
                "amount": 66
            }
        ]
    }
]

【问题讨论】:

  • 您的每个人的data 有时有currency,有时有asset_id。有没有一致性?它们会被解释为同一个东西吗?
  • 嘿!对不起,这是一个错误,都是货币!
  • 欢迎来到 Stack Overflow!请拨打tour,阅读what's on-topic hereHow to Askquestion checklist,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。你必须诚实地尝试,然后就你的算法或技术提出一个具体问题
  • 你好@PranavHosangadi。我已经尝试了几个小时来获取这段代码,但没有成功,很抱歉,但我无法为“Total”部分提供一段工作代码。
  • 为什么没有成功? debugging你做了什么?你得到什么错误?您要求我们为您提供代码来完成您的工作,但您自己没有表现出任何努力。您需要展示您的代码并询问您在代码中遇到的特定问题。堆栈溢出不是免费的在线编码服务。您了解如何迭代列表的元素吗?如何访问字典中的项目?如何将数字添加到字典的特定键?您具体遇到了什么问题?

标签: python arrays json algorithm object


【解决方案1】:

假设您的列表名为s,试试这个:

total = dict()
for d in s:
    for ccy in d["data"]:
        if ccy["currency"] in total:
            total[ccy["currency"]]["amount"] += ccy["amount"]
        else:
            total[ccy["currency"]] = {"amount": ccy["amount"]}
>>> total
'Euro': {'amount': 180.0}, 'Dollar': {'amount': 267}, 'Yen': {'amount': 866}}

如果你想在之后将两者合并到一个列表中,你可以这样做:

s = [{"name": "Total", "data": [total]}] + s
>>> s
[{'name': 'Total',
  'data': [{'Euro': {'amount': 180.0},
            'Dollar': {'amount': 267},
            'Yen': {'amount': 866}}]},
 {'name': 'John',
  'data': [{'currency': 'Euro', 'amount': 100.0},
           {'currency': 'Dollar', 'amount': 223},
           {'currency': 'Yen', 'amount': 800}]},
 {'name': 'Jack',
  'data': [{'currency': 'Dollar', 'amount': 32},
           {'currency': 'Euro', 'amount': 80}]},
 {'name': 'Elise',
  'data': [{'currency': 'Dollar', 'amount': 12},
           {'currency': 'Yen', 'amount': 66}]}]

【讨论】:

  • 将项目添加到列表的首选方法是s.append(item)(它更符合 Pythonic + 更快)。
  • @fsimonjetz - 你错了。列表理解比append很多
  • 对不起,我说的是s = [{"name": "Total", "data": [total]}] + s,你说的列表理解是对的!
  • %timeit [{"name": "Total", "data": [total]}] + s 每个循环 275 ns ± 5.59 ns(平均值 ± 标准偏差,7 次运行,每次 1000000 次循环)
  • 抱歉,感谢您抽出宝贵时间回复,我不是算法复杂性方面的专家,但您可能只对单个元素是正确的。由于串联复制了整个内容,它应该是 O(n^2) 而append 只会在列表末尾放置一个新元素,因此它是 O(n) 最坏的情况。参照。 this articlethis SO question,例如不过我可能错了。
猜你喜欢
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多