创建一个连接另外两个词组的词典[Python]

时间:2018-01-19 19:36:19

标签: python dictionary

我正在尝试创建一个下面的词组的连接点:

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。

谢谢!

3 个答案:

答案 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_longestizip_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