【问题标题】:Python nested dictionary add key:values from jsonPython嵌套字典添加键:来自json的值
【发布时间】:2018-02-06 15:38:16
【问题描述】:

这是我在 StackOverflow 上的第一个问题。 我一如既往地搜索(这就是为什么这是我的第一个问题!)但似乎无法理解似乎是一个简单的问题......

我在做什么:

  • 我从加密货币 API 作为 json 获得答案
  • 我过滤此 json 以仅获取我想要的元素
  • 然后,我将每个市场的“从/到:价格”键:值对添加到字典中

我的问题

我想像这样建立一个字典:

{Market:{FROM/TO: price, FROM/TO: price, ...}, {Market:{FROM/TO: price, FROM/TO: price, ...}, ...}

之后将其用作数据框。

但我从我的实际代码中得到的是这样的字典:

{市场:{FROM/TO:价格},{市场:{FROM/TO:价格}}

其中 'FROM/TO: price' 是 API 发送的最后一个 'Key:value'(在我的示例代码中,当它存在于市场时,它是 ETH/USD)。

我希望我的代码“查看”字典中已存在“市场”键的位置,并将所有新的“FROM/TO:价格”对附加到此“市场”键。

我知道我的代码有问题(很明显),但我真的无法理解它......

我的实际代码

import requests
import json

d = {}
s = []
def get_data_from_url(*args):
"""
Get datas from an API url.
Treat it as json and filter everything not needed.
"""
for symbol_pair in args:
    for symbols in symbol_pair:
        from_symbol, to_symbol = symbols
        url = 'https://www.cryptocompare.com/api/data/coinsnapshot/?fsym=' \
            + from_symbol + '&tsym=' + to_symbol
        resp = requests.get(url=url)
        datas = json.loads(resp.text)

        # filter to get only the exchanges data
        exchanges_data = datas["Data"]["Exchanges"]

        for data_dict in exchanges_data:
            if data_dict["TOSYMBOL"] == "WUSD":
                data_dict["TOSYMBOL"] = "USD"
            # if the exchange is not outdated
            if data_dict["VOLUME24HOUR"] != "0":
                # s.append([data_dict["MARKET"], {data_dict["FROMSYMBOL"] + "/" + data_dict["TOSYMBOL"]: data_dict["PRICE"]}])
                d[data_dict["MARKET"]] = {}

                d[data_dict["MARKET"]].update({data_dict["FROMSYMBOL"] + "/" + data_dict["TOSYMBOL"]: data_dict["PRICE"]})
print(d)

args = [("BTC", "USD"), ("ETH", "USD")]

get_data_from_url(args)

你能帮我解决这个问题吗? 我将不胜感激!

感谢大家,让 Pythonistas 保持愉快 :)

【问题讨论】:

  • 您能否格式化您的数据样本,因为它会出现在格式正确的文档中?
  • 请发布一个不依赖任何外部资源的 MCVE(datas 在示例中应该是硬编码的)并且示例输出来自给定的datas
  • 嗨!对此我很抱歉,下次我将发布没有外部依赖项的 MCVE。 @v100ev 让我走上了正轨,他的解决方案有效,我知道这很“容易”。感谢大家的早期回复:) PS:如果将来有人需要,我将编辑我的代码以发布不依赖于外部来源的数据。

标签: python json dictionary nested


【解决方案1】:

好的,我想我有你的问题。这很简单——你每次都在创建一个字典并更新它。您应该先检查它是否存在,然后再更新。如果它不存在 - 使用它的第一个元素创建它。像这样的东西(它有效):

            # if the exchange is not outdated
            if data_dict["VOLUME24HOUR"] != "0":
                if d.get(data_dict["MARKET"]):
                    d[data_dict["MARKET"]].update({data_dict["FROMSYMBOL"] + "/" + data_dict["TOSYMBOL"]: data_dict["PRICE"]})
                else:
                    d[data_dict["MARKET"]]= {data_dict["FROMSYMBOL"] + "/" + data_dict["TOSYMBOL"]: data_dict["PRICE"]}

【讨论】:

  • 感谢@v100ev,您的回答有效,我知道这并不难!你让我免于更多的头痛。 :)
【解决方案2】:

每次更新d[data_dict["MARKET"]],首先将其设置为{}。所以当然它只包含最后一条数据;当下一条数据出现时,所有其他的都被删除了。您应该查找现有字典并仅在它不存在时将空字典作为默认值。例如:

 d[data_dict["MARKET"]] = d.get([data_dict["MARKET"],{}).update({data_dict["FROMSYMBOL"] + "/" + data_dict["TOSYMBOL"]: data_dict["PRICE"]})

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 2018-04-25
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多