Python嵌套字典添加键:来自json

时间:2018-02-06 15:38:17

标签: python json dictionary nested

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

我在做什么:

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

我的问题

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

{Market:{FROM / TO:price,FROM / TO:price,...},{Market:{FROM / TO:price,FROM / TO:price,...},...} < / p>

之后将其用作数据帧。

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

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

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

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

我知道我的代码出了问题(显然),但我真的无法理解它......

我的实际代码

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

好的,我想我遇到了你的问题。这很简单 - 你每次创建一个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"]}