Добавление словарей в цикле for - PullRequest
0 голосов
/ 10 марта 2019

Извините, если это спросили, я искал тонну и не нашел то, что я ищу.Множество способов объединить словари, но не нашли ничего для объединения в цикле, который применяется.

У меня есть функция (masternodes ()), которая будет возвращать отфильтрованный набор запросов.С каждым объектом, возвращаемым из этого набора запросов, я выполняю цикл и запрашиваю другую функцию (masternodeDetail ()), чтобы получить некоторые сведения об этом объекте.Функция (masternodeDetail ()) возвращает словарь.Я хотел бы объединить словари, возвращенные в один словарь, чтобы я мог передать это моему шаблону.

Вот мой код, с которым я работал:

def masternodes(request):
  user = request.user
  mn = {}
  queryset = Masternode.objects.filter(created_by=user)    
  for n in queryset:
    mn = masternodeDetail(n.wallet_address, n.coin_symbol)
  print(mn)

  args = {'masternodes': queryset, 'masternodetail': mn}
  return render(request, 'monitor.html', args)

def masternodeDetail(wallet, ticker):
  monitorinfo = MonitorInfo.objects.get(coin_symbol=ticker)
  coin_symbol = monitorinfo.coin_symbol
  daemon = monitorinfo.daemon
  rpc_user = monitorinfo.rpc_user
  rpc_password = monitorinfo.rpc_password
  rpc_port = monitorinfo.rpc_port
  coin_name = monitorinfo.coin_name
  notes = monitorinfo.notes
  masternode_reward = monitorinfo.masternode_reward
  coingecko_id = monitorinfo.coingecko_id
  json_output = monitorinfo.json_output    
  headers = {'content-type': 'text/plain'}
  payload = {"method": "masternodelist", "params": ['full', wallet], "jsonrpc": "1.0", "id": "MN Monitoring v0.1"}
  response = requests.post("http://" + daemon + ":" + rpc_port, json=payload, headers=headers, auth=(rpc_user,rpc_password)).json()    
  res = response["result"]

  if json_output == False:
    for k,v in res.items():
        list = v.split()
        ## status protocol payee lastseen activeseconds lastpaidtime lastpaidblock IP ##
        status = list[0]
        protocol = list[1]
        payee = list[2]
        lastseen = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(float(list[3])))
        activeseconds = datetime.timedelta(seconds=float(list[4]))
        lastpaidtime = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(float(list[5])))
        lastpaidblock = list[6]
        nodeip = list[7].split(':', 1)[0]
        masternode_result = {payee: {'coin':coin_symbol, 'coin_name':coin_name, 'notes':notes, 'masternode_reward':masternode_reward, 
            'coingecko_id':coingecko_id, 'status':status, 'protocol':protocol, 'payee':payee, 'lastseen': lastseen, 
            'activeseconds': activeseconds, 'lastpaidtime': lastpaidtime, 'lastpaidblock': lastpaidblock, 'nodeip': nodeip}}            
        masternodes_result = {**masternode_result, **masternode_result}
        return masternodes_result
  else:        
    for txid in res:
        status = res[txid]['status']
        nodeip = res[txid]['address'].split(':', 1)[0]
        protocol = res[txid]['protocol']
        payee = res[txid]['payee']
        lastseen = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(float(res[txid]['lastseen'])))
        activeseconds = datetime.timedelta(seconds=float(res[txid]['activeseconds']))
        lastpaidtime = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(float(res[txid]['lastpaidtime'])))
        lastpaidblock = res[txid]['lastpaidblock']
        masternode_result = {payee: {'coin':coin_symbol, 'coin_name':coin_name, 'notes':notes, 'masternode_reward':masternode_reward, 
            'coingecko_id':coingecko_id, 'status':status, 'protocol':protocol, 'payee':payee, 'lastseen': lastseen, 
            'activeseconds': activeseconds, 'lastpaidtime': lastpaidtime, 'lastpaidblock': lastpaidblock, 'nodeip': nodeip}}
        masternodes_result = {**masternode_result, **masternode_result}
        return masternodes_result

Как мне объединить это в один словарь или получить всю необходимую мне информацию обратно в мой шаблон?Вы можете увидеть одну из моих многочисленных попыток, используя метод {, }, который я использовал ранее, но так как это не два разных названных словаря, я думаю, поэтому он не работает.Прямо сейчас, последний словарь, возвращаемый из моего цикла, - это то, что передается.Может быть, я подхожу к этому совершенно неправильно, и есть лучший способ получить эту информацию?Предложения?

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Начните с пустого словаря full_dict и используйте full_dict.update(d) для добавления словаря d в full_dict.

Имейте в виду, что если есть общие ключи между full_dict и d,они будут заменены.

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

full_dict = {}
dict_a = {"a": 10, "b": 20}
dict_b = {"b": 100, "c": 120}

for d in (dict_a, dict_b):
    full_dict.update(d)

print(full_dict)  # {"a": 10, "b": 100, "c": 120}
0 голосов
/ 10 марта 2019

Я не думаю, что вы хотите «единый словарь», я не могу себе представить, как это будет выглядеть. Вместо этого вам, вероятно, нужен список словарей - в этом случае вы можете сделать:

mn = []
for n in queryset:
    mn.append(masternodeDetail(n.wallet_address, n.coin_symbol))

или даже короче:

mn = [masternodeDetail(n.wallet_address, n.coin_symbol) for n in queryset]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...