Добавление к спискам вложенных Dict - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть вложенный набор пустых списков:

mom_fut = {'M2K': {'comm': [], 'mtm': []},
           'MNQ': {'comm': [], 'mtm': []},
           'NG': {'comm': [], 'mtm': []},
           'QM': {'comm': [], 'mtm': []},
           'VIX': {'comm': [], 'mtm': []},
           'ZS': {'comm': [], 'mtm': []},
           'ZW': {'comm': [], 'mtm': []}}

Я перебираю список строк, которые могут содержать основные ключи dict. Если основной ключ присутствует, я добавляю соответствующие значения (из отдельного df) в соответствующие вложенные списки ('comm' и 'mtm'):

for des in mom_fut_des:
    symb, mat = des.split()
        mom_fut[symb]['comm'].append(mtm_fut_mom.commissions[mtm_fut_mom.description == des].sum())
        mom_fut[symb]['mtm'].append(mtm_fut_mom.total[mtm_fut_mom.description == des].sum())

Однако вместо добавления соответствующих значений к соответствующие списки значений ключей и возвращение заполненного запроса, который я хочу (и ожидал):

{'M2K': {'comm': [-25.5777713], 'mtm': [-217.5835163]},
'MNQ': {'comm': [-1.8012515], 'mtm': [-3.7174765]},
 'NG': {'comm': [-12.7160691], 'mtm': [-326.9769691]},
 'QM': {'comm': [-1.5866343], 'mtm': [-49.4922593]},
 'VIX': {'comm': [-1.8242462], 'mtm': [-97.6354962]},
 'ZS': {'comm': [-12.9690108], 'mtm': [-415.3762608]},
 'ZW': {'comm': [-15.1305126], 'mtm': [-235.4963876]}}

Он возвращает все значения в соответствующий вложенный список каждого ключа:

{'M2K': {'comm': [-25.5777713,
   -1.8012515,
   -12.7160691,
   -1.5866343,
   -12.9690108,
   -1.8242462,
   -15.1305126],
  'mtm': [-217.5835163,
   -3.7174765,
   -326.9769691,
   -49.4922593,
   -415.3762608,
   -97.6354962,
   -235.4963876]},
 'MNQ': {'comm': [-25.5777713,
   -1.8012515,
   -12.7160691,
   -1.5866343,
   -12.9690108,
   -1.8242462,
   -15.1305126],
  'mtm': [-217.5835163,
   -3.7174765,
   -326.9769691,
   -49.4922593,
   -415.3762608,
   -97.6354962,
   -235.4963876]},
 'NG': {'comm': [-25.5777713,
   -1.8012515,
   -12.7160691,
   -1.5866343,
   -12.9690108,
   -1.8242462,
   -15.1305126],
  'mtm': [-217.5835163,
   -3.7174765,
   -326.9769691,
   -49.4922593,
   -415.3762608,
   -97.6354962,
   -235.4963876]},
 'QM': {'comm': [-25.5777713,
   -1.8012515,
   -12.7160691,
   -1.5866343,
   -12.9690108,
   -1.8242462,
   -15.1305126],
  'mtm': [-217.5835163,
   -3.7174765,
   -326.9769691,
   -49.4922593,
   -415.3762608,
   -97.6354962,
   -235.4963876]},
 'VIX': {'comm': [-25.5777713,
   -1.8012515,
   -12.7160691,
   -1.5866343,
   -12.9690108,
   -1.8242462,
   -15.1305126],
  'mtm': [-217.5835163,
   -3.7174765,
   -326.9769691,
   -49.4922593,
   -415.3762608,
   -97.6354962,
   -235.4963876]},
 'ZS': {'comm': [-25.5777713,
   -1.8012515,
   -12.7160691,
   -1.5866343,
   -12.9690108,
   -1.8242462,
   -15.1305126],
  'mtm': [-217.5835163,
   -3.7174765,
   -326.9769691,
   -49.4922593,
   -415.3762608,
   -97.6354962,
   -235.4963876]},
 'ZW': {'comm': [-25.5777713,
   -1.8012515,
   -12.7160691,
   -1.5866343,
   -12.9690108,
   -1.8242462,
   -15.1305126],
  'mtm': [-217.5835163,
   -3.7174765,
   -326.9769691,
   -49.4922593,
   -415.3762608,
   -97.6354962,
   -235.4963876]}}

Я могу получить «правильный» вывод, настраивая код и используя dict.update ()

for des in mom_fut_des:
    symb, mat = des.split()
    comm = mtm_fut_mom.commissions[mtm_fut_mom.description == des].sum()
    mtm = mtm_fut_mom.total[mtm_fut_mom.description == des].sum()
    mom_fut.update({symb:{'comm':[comm],'mtm':[mtm]}})

Но мне нужно использовать списки и добавлять, так как у меня может быть более одного экземпляра каждого ключа, поэтому потенциально несколько значения в каждом вложенном списке.

1 Ответ

0 голосов
/ 18 февраля 2020

Проблема решена.

Проблема заключалась в том, как был создан диктат. Я использовал dict.fromkeys (), который я не знал, что на самом деле «использует один и тот же объект для всех значений ... Это означает, что все ключи имеют один и тот же пустой список ... Когда вы пытаетесь .append к значению одного списка, изменения вносятся в объект на месте, поэтому все изменения, которые на него ссылаются, видны для него ». См. Добавление значения к одному списку в словаре. Добавление значения ко всем спискам в словаре.

Вместо того, чтобы использовать его для понимания, проблема была решена, итерация и добавление работали, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...