我正在尝试创建一个下面的词组的连接点:
buy_dict = {'Coin1': [{'buy_price': 105, 'id_buy':2 },{'buy_price': 100, 'id_buy':1 }], 'Coin2': [{'buy_price': 1200, 'id_buy':2 },{'buy_price': 1100, 'id_buy':1 }]}
sell_dict = {'Coin1': [{'sell_price': 106, 'id_sell':1 }, {'sell_price': 110, 'id_sell':2 }], 'Coin2': [{'sell_price': 1250, 'id_sell':1 },{'sell_price': 1350, 'id_sell':2 }]}
在buy_dict上,我有一个买入价及其ID的字典,由Coin分组。 sell_dict上的相同模型。我需要做的是通过加入来自两个dicts adobe的数据来创建第三个dict,因此新dict的第一个记录将是dictA的第一个记录加上dictB的第一个记录。以下是它的外观:
DictC = {'Coin1': [{'buy_price': 105, 'id_buy':2, 'sell_price': 106, 'id_sell':1}, {'buy_price': 100, 'id_buy':1, 'sell_price': 110, 'id_sell':2}], 'Coin2': [{'buy_price': 1200,'id_buy':2, 'sell_price': 1250,'id_sell':1}, {'buy_price': 1100, 'id_buy':1,'sell_price': 1350,'id_sell':2}]}
简而言之,DictC的记录将是最高购买价格和最低售价的交汇点。无需订购,因为已经订购了buy_dict和sell_dict。
谢谢!
答案 0 :(得分:1)
这个技巧是你要组合两个词典并按顺序迭代数组。与我的一个乔斯答案的不同之处在于,我只能容忍一个硬币只存在于一个字典中,每个清单中的销售和购买数量不同。
from collections import defaultdict
from itertools import zip_longest
DictC = defaultdict(list)
for coin in (buy_dict.keys() | sell_dict.keys()):
for buy_item, sell_item in zip_longest(buy_dict.get(coin, []), sell_dict.get(coin, []), fillvalue={}):
DictC[coin].append({**buy_item, **sell_item})
对于python2.7,用{/ p>替换DictC[coin].append({**buy_item, **sell_item})
temp = buy_item.copy()
temp.update(sell_item)
DictC[coin].append(temp)
和buy_dict.keys() | sell_dict.keys()
与set(buy_dict.keys() + sell_dict.keys())
和zip_longest
与izip_longest
答案 1 :(得分:0)
我找到的最简单的方法是:
dictD = {}
for coin in sell_dict:
coinList = []
for things in zip(sell_dict[coin], buy_dict[coin]):
joinedDict = {}
for d in things:
joinedDict.update(d)
coinList.append(joinedDict)
dictD[coin] = coinList
我在这里假设sell_dict和buy_dict的键是相同的。除了做明显的for循环之外,除了使用zip以使列表按照你想要的方式对齐之外,没有什么特别之处。
答案 2 :(得分:-1)
您可以在一行dictionary-comprehension
中执行此操作:
{k: [{**buy_dict[k][i], **sell_dict[k][i]} for i in range(len(buy_dict[k]))] for k in buy_dict}
给出了您想要的输出:
{'Coin1': [{'id_sell': 1, 'buy_price': 105, 'id_buy': 2, 'sell_price': 106}, {'id_sell': 2, 'buy_price': 100, 'id_buy': 1, 'sell_price': 110}], 'Coin2': [{'id_sell': 1, 'buy_price': 1200, 'id_buy': 2, 'sell_price': 1250}, {'id_sell': 2, 'buy_price': 1100, 'id_buy': 1, 'sell_price': 1350}]}
<强>为什么吗
我们想要遍历key
中的每个buy_dict
,这是我们最外层的循环。然后在此内部,我们要将此键设置为list
的值。这是通过语法{k: [...] for k in buy_dict}
完成的。
这个list
会发生什么?好了,因为原始dictionaries
中的列表已经正确排序,我们可以将它们解压缩到自己的新列表中。
为此,我们遍历buy_dict[k]
列表中的不同索引,然后使用解包技术seen here来形成新词典。
请注意,由于字典没有顺序,输出的字典当然与你的字典完全相同;它们只是一组key:value
对