Способ удаления ключей с массивом нулей в качестве значения - PullRequest
0 голосов
/ 04 декабря 2018

Я вложил dict следующим образом:

 u'dvlRaw':{
   u'diagnosticInfoUDP': { 
      u'clientConnected': array([0, 0, 0, 0, 0, 0, 0,0, 0,0], dtype=uint8),
      u'channel': array([1, 1, 1, ..., 1, 1, 1], dtype=uint32)
     }
 }

Как удалить ключ, пары значений, для которых значения имеют весь массив нулей в нем.Положение массива нулей может быть не постоянным, иногда это может быть значением child_dictionary, иногда это может быть значением child of child_dictionary.Существует ли общий способ удаления вхождения массива нулей в зависимости от того, какое значение child_dictionary указано в

Ответы [ 4 ]

0 голосов
/ 04 декабря 2018

Для точной структуры, которую вы определили, вы можете использовать словарное понимание с np.ndarray.any:

import numpy as np

dct = {u'dvlRaw': {u'diagnosticInfoUDP': 
       {u'clientConnected': np.array([0, 0, 0, 0, 0, 0, 0,0, 0,0], dtype='uint8'),
        u'channel': np.array([1, 1, 1, 1, 1, 1, 1], dtype='uint32')}}}

res = {u'dvlRaw': {u'diagnosticInfoUDP':
       {k: v for k, v in dct[u'dvlRaw'][u'diagnosticInfoUDP'].items() if v.any()}}}

print(res)

{'dvlRaw': {'diagnosticInfoUDP': {'channel': array([1, 1, 1, 1, 1, 1, 1], dtype=uint32)}}}
0 голосов
/ 04 декабря 2018

Вы можете создать новый вложенный dict из вашего существующего dict:

bob = {"bob" : {"nob": np.zeros(10), "dob" : np.ones(10)}}

bob2 = {k : {k2 : bob[k][k2] for k2 in bob[k].keys() if not (bob[k][k2] == 0).all()} for k in bob.keys()}

В этом примере мой вложенный dict называется bob, я создаю новый вложенный dict из него следующим образом:

  • Для каждого ключа k в bob создайте новый dict.
  • Новый дикт будет содержать только ключи k2 из bob[k], если bob[k][k2]не все нули.

Обратите внимание, что я перебираю ключи от bob, k, и от каждого внутреннего dict, на его ключах, 'k2', я использую ключи для извлечения значений.

0 голосов
/ 04 декабря 2018

Это довольно простой способ:

d = {'dvlRaw':{'diagnosticInfoUDP': {'clientConnected': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'channel': [1, 1, 1, 1, 1, 1]}}}


def all_zeroes(arr):
  return 0 in set(arr) and len(set(arr)) == 1

remove = []
for k, v in d['dvlRaw']['diagnosticInfoUDP'].items():
  if all_zeroes(v): remove.append(k) 

for k in remove:
  del d['dvlRaw']['diagnosticInfoUDP'][k]

print(d)
#=> {'dvlRaw': {'diagnosticInfoUDP': {'channel': [1, 1, 1, 1, 1, 1]}}}
0 голосов
/ 04 декабря 2018

Используйте numpy.any, чтобы проверить, содержит ли каждый массив ненулевое значение:

import numpy as np

diagnosticInfoUDP = dictionary['dvlRaw']['diagnosticInfoUDP']
for key in list(diagnosticInfoUDP):
    if not np.any(diagnosticInfoUDP[key]):
        del diagnosticInfoUDP[key]

РЕДАКТИРОВАТЬ: Общее решение для удаления массивов только из нуля из произвольноВложенный словарь:

def clean_dict(dictionary):
    for key, value in list(dictionary.items()):
        if isinstance(value, np.ndarray) and not np.any(value):
            del dictionary[key]
        elif isinstance(value, dict):
            clean_dict(value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...