Python Nested Dictionary添加键:JSON的值



这是我在stackoverflow上的第一个问题。我一如既往地整个搜索(这就是为什么这是我有史以来的第一个问题!(,但似乎无法让我围绕似乎是一个简单的问题...

我正在做什么:

  • 我从加密货币API中获得答案,作为JSON
  • 我过滤了这个json,以获取我想要的元素
  • 我将每个市场添加为"从/到:价格"键:value对到字典

我的问题

我想构建像这样的字典:

{市场:{从/到:价格,从/到:价格,...},{market:{from/to:price,从/到:价格,...},...},...}

之后将其用作数据框。

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

{市场:{从/到:价格},{市场:{从/到:Price}}}

where'从/到:价格'是API发送的最后一个'键:值:在我的示例代码中,是ETH/USD,当它存在于市场时(。

我希望我的代码"查看"字典中已经存在"市场"密钥,并将所有新的"从/到:价格"配对到"市场"键。

我知道我的代码有问题(显然(,但我真的无法绕过它...

我的实际代码

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:(

好吧,我想我有你的问题。这很简单 - 您每次都会创建一个dict和更新。您应该首先检查它是否存在,然后进行更新。如果不存在 - 使用它的第一个元素来创建它。这样的东西(有效(:

            # 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"]}

每次更新d[data_dict["MARKET"]]时,您都会将其设置为{}。因此,当然只包含最后一块数据;当下一个数据出现时,所有其他数据都被删除。您应该查找现有词典,并仅在不存在时将空词典以默认为单位。例如:

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

最新更新