Python 构建dict并将其填充到for循环中

Python 构建dict并将其填充到for循环中,python,json,dictionary,Python,Json,Dictionary,我正在尝试建立一个字典,其中应该包含关于硬币、日期和给定日期的收盘价的数据 我循环使用的数据(我将其用作构建dict的基础)如下所示(这是一个Python列表): 这是一个元组列表,每个元组中都有一个值:(日期、硬币、收盘价) 最后我期望的JSON应该如下所示: { "coins": [{ "BTC": [{ "2018-08-31": 7014.6000977 }, {

我正在尝试建立一个字典,其中应该包含关于硬币、日期和给定日期的收盘价的数据

我循环使用的数据(我将其用作构建dict的基础)如下所示(这是一个Python列表):

这是一个元组列表,每个元组中都有一个值:
(日期、硬币、收盘价)

最后我期望的JSON应该如下所示:

{
    "coins": [{
        "BTC": [{
            "2018-08-31": 7014.6000977
        }, {
            "2018-09-01": 7197.3999023
        }],
        "EOS": [{
            "2018-08-31": 6.4050002
        }, {
            "2018-09-01": 6.6620002
        }]
    }]
}
prices_json = {"coins": []}
for date, _coin, close_price in prices: #prices is the above-mentioned list of tuples
    if date:
        prices_json["coins"].append(
            {
                f"{_coin}": []
            }
        )
        prices_json["coins"][0][f"{_coin}"].append(
            {
                f"{date}": f"{close_price}"
            }
        )
我当前构建这种JSON的代码如下所示:

{
    "coins": [{
        "BTC": [{
            "2018-08-31": 7014.6000977
        }, {
            "2018-09-01": 7197.3999023
        }],
        "EOS": [{
            "2018-08-31": 6.4050002
        }, {
            "2018-09-01": 6.6620002
        }]
    }]
}
prices_json = {"coins": []}
for date, _coin, close_price in prices: #prices is the above-mentioned list of tuples
    if date:
        prices_json["coins"].append(
            {
                f"{_coin}": []
            }
        )
        prices_json["coins"][0][f"{_coin}"].append(
            {
                f"{date}": f"{close_price}"
            }
        )
我想从提供的元组列表中构建这样的JSON的原因是,我想通过以下方式访问close_price数据:

my_json_with_prices[f"{coin}"][f"{date}"]
my_json_与_价格[f{coin}][f{date}]
这将导致收盘价编号,例如
6.4050002

脚本稍后将在for循环中提供
f{coin}
f{date}
的值


如果您对如何从基于
日期的元组列表和
硬币的元组列表中访问
收盘价
有任何其他想法,我愿意接受所有建议。

您正在构建的结构具有多个嵌套级别。让我们从里到外考虑一下

每枚硬币的数据都是从日期到价值的映射。这是一个单独的
dict
,而不是一个单独的词典列表。要添加新映射,只需设置
coindict[date]=value

上面的结构是一个硬币名称字典,这些名称是字符串,上面描述的
coindict
是每个名称的值

Python的
defaultdict
提供了一种很好的方法来避免必须通过

如果钥匙不在驾驶员信息中心:
dic[key]=dict()
#现在可以安全地向dic[key]添加内容
因此,让我们遍历您的输入结构

从集合导入defaultdict
#看https://stackoverflow.com/questions/5029934/defaultdict-of-defaultdict
收盘价=defaultdict(lambda:defaultdict(dict))
对于日期、硬币、价格:
收盘价[硬币][日期]=价格
演示:

现在,
close\u price[coin][date]
date
生成
coin
的收盘价,当然假设
date
作为
close\u price[coin]
中的一个键存在。要循环查看某一特定硬币的可用日期,只需对收盘价[硬币]中的日期进行

如果您想将
close\u price
放在另一本词典中,这也很容易,但似乎是多余的:

不必要={“硬币”:[收盘价]}
如果要将其保存为JSON,请尝试

导入json
以open('coins.json','w')作为jfile:
dump(不需要,jfile)
使用熊猫-

import pandas as pd
df  = pd.DataFrame(l1,columns= ['date','coin', 'value'])
temp_list = df.groupby('coin',as_index=False).agg(list).to_dict(orient='records')
result = {
    item['coin']: (dict(zip(item['date'], item['value'])))
    for item in temp_list
}
result = {'coins': result}
print(result)

输出-

{'coins': {'ADA': {'2018-08-31': 0.1039, '2018-09-01': 0.1098},
  'BCH': {'2018-08-31': 542.4199829, '2018-09-01': 618.8699951},
  'BNB': {'2018-08-31': 10.96, '2018-09-01': 11.4499998},
  'BSV': {'2018-08-31': 0.0, '2018-09-01': 0.0},
  'BTC': {'2018-08-31': 7014.6000977},
  'BTT': {'2018-08-31': 0.0, '2018-09-01': 0.0},
  'DASH': {'2018-08-31': 194.25},
  'EOS': {'2018-08-31': 6.4050002, '2018-09-01': 6.6620002},
  'ETC': {'2018-08-31': 12.7299995, '2018-09-01': 13.1899996},
  'ETH': {'2018-08-31': 281.6300049},
  'LTC': {'2018-08-31': 62.1300011, '2018-09-01': 66.5},
  'NEO': {'2018-08-31': 20.1100006},
  'QTUM': {'2018-08-31': 4.7399998},
  'TRX': {'2018-08-31': 0.02532},
  'XLM': {'2018-08-31': 0.2216},
  'XMR': {'2018-08-31': 116.1399994, '2018-09-01': 121.0299988},
  'XRP': {'2018-08-31': 0.335},
  'ZEC': {'2018-08-31': 149.6300049}}}

您正在字典中创建不必要的嵌套。您可以按如下方式表示数据:

    prices_json = {
        currency1 : {
            date1 : price1,
            date2 : price2
        }
        
        currency2 : {
            date1 : price1,
            date2 : price2
        }
    }
给定元组列表

prices = [('2018-08-31', 'BSV', 0.0), ('2018-08-31', 'EOS', 6.4050002), ('2018-08-31', 'ETC', 12.7299995), ('2018-08-31', 'BNB', 10.96), ('2018-08-31', 'LTC', 62.1300011), ('2018-08-31', 'XMR', 116.1399994), ('2018-08-31', 'BTT', 0.0), ('2018-08-31', 'BCH', 542.4199829), ('2018-08-31', 'ADA', 0.1039), ('2018-08-31', 'DASH', 194.25), ('2018-08-31', 'BTC', 7014.6000977), ('2018-08-31', 'ZEC', 149.6300049), ('2018-08-31', 'XLM', 0.2216), ('2018-08-31', 'XRP', 0.335), ('2018-08-31', 'QTUM', 4.7399998), ('2018-08-31', 'NEO', 20.1100006), ('2018-08-31', 'ETH', 281.6300049), ('2018-08-31', 'TRX', 0.02532), ('2018-09-01', 'BSV', 0.0), ('2018-09-01', 'EOS', 6.6620002), ('2018-09-01', 'ETC', 13.1899996), ('2018-09-01', 'BNB', 11.4499998), ('2018-09-01', 'LTC', 66.5), ('2018-09-01', 'XMR', 121.0299988), ('2018-09-01', 'BTT', 0.0), ('2018-09-01', 'BCH', 618.8699951), ('2018-09-01', 'ADA', 0.1098)
加载到
prices\u json
的代码可能如下所示

prices_json = {}

for date, currency, price in prices:
  
    prices_json[currency] = prices_json.get(currency, {})
    prices_json[currency][date] = price
运行代码后,您可以通过这种方式获取给定日期特定货币的价格

prices_json[currency][date]
你的问题是:

我想从提供的 元组是,我希望通过以下方式访问close_price数据:

my_json_with_prices[f"{coin}"][f"{date}"]
您不需要JSON结构。JSON是一种交换格式。Python的本机dict将完全满足您的需要。即便如此:

 my_json_with_prices[f"{coin}"][f"{date}"]
它过于复杂。Python的等价物是

 python_equivalent[coin][date]
您可以按如下方式构建一个结构:

# Start with the data
data = [('2018-08-31', 'BSV', 0.0), ('2018-08-31', 'EOS', 6.4050002), ('2018-08-31', 'ETC', 12.7299995), ('2018-08-31', 'BNB', 10.96), ('2018-08-31', 'LTC', 62.1300011), ('2018-08-31', 'XMR', 116.1399994), ('2018-08-31', 'BTT', 0.0), ('2018-08-31', 'BCH', 542.4199829), ('2018-08-31', 'ADA', 0.1039), ('2018-08-31', 'DASH', 194.25), ('2018-08-31', 'BTC', 7014.6000977), ('2018-08-31', 'ZEC', 149.6300049), ('2018-08-31', 'XLM', 0.2216), ('2018-08-31', 'XRP', 0.335), ('2018-08-31', 'QTUM', 4.7399998), ('2018-08-31', 'NEO', 20.1100006), ('2018-08-31', 'ETH', 281.6300049), ('2018-08-31', 'TRX', 0.02532), ('2018-09-01', 'BSV', 0.0), ('2018-09-01', 'EOS', 6.6620002), ('2018-09-01', 'ETC', 13.1899996), ('2018-09-01', 'BNB', 11.4499998), ('2018-09-01', 'LTC', 66.5), ('2018-09-01', 'XMR', 121.0299988), ('2018-09-01', 'BTT', 0.0), ('2018-09-01', 'BCH', 618.8699951), ('2018-09-01', 'ADA', 0.1098

# Get the coins
coins = set(d[1] for d in data)

# Build an empty lookup table for each coin
lookup = {}
for c in coins:
    lookup[c] = {}

# Now populate it
for date, c, price in data:
    lookup[c][date] = price
(这可以用更少的步骤来完成。)这将允许您这样做

required_value = lookup[coin][date]
如果您真的想要一个JSON结构,尽管我无法想象为什么,除非您将它传递给其他程序,那么

my_json_with_prices = json.dumps(lookup)

您似乎在问如何构建字典,而不是如何生成JSON。我已经进行了相应的编辑,但在JSON术语中留下了几个地方。请回顾。
f{u coin}
是一种非常迂回的方式,可以说
str({u coin)
,或者如果你知道它已经是一个字符串,那么就说
\u coin
。为什么你要将endprices存储为一个日期->值的dict列表?如果你每枚硬币每一天只有一个收盘价,那么一个日期->值就足够了。如果你的收盘价超过1,那么你就是一个时间旅行者……根目录中只有
“coins”
作为其唯一的键,在这里似乎是完全多余的。为什么你希望最里面的信息是一个字典列表,每个字典中只有一个键?假设日期总是唯一的(因为你会如何解释数据?一枚硬币在给定的时间不可能有两个正确的值),那么每枚硬币的信息仅仅是一本字典是有意义的。(我猜@Patrick也在试图说类似的话。)熊猫对于这个简单的任务来说是严重的过度捕杀。对于初学者来说,代码太密集了。是的。这只是解决问题的另一种方式。另外,如果需要,您可以非常轻松地执行更多操作:)谢谢@Nk03,但我使用了nilTheDev的代码:)谢谢@BoarGules-我没有使用您的代码,但再次感谢您的时间和努力:)