Проверка ненулевых значений в словаре

Я нахожусь в процессе написания программы, которая подключается к коммутатору или маршрутизатору Cisco, а затем проверяет вывод «show int». Затем я обрабатываю/анализирую данные до такой степени, что у меня есть словарь из двадцати одной пары ключ/значение. Все значения являются целыми числами. Он работает именно так, как я хочу до этого момента.

У меня возникли проблемы с визуализацией того, что я хочу делать дальше, и я надеялся, что смогу получить некоторые идеи и / или рекомендации.

Я хочу сделать следующее:

Проверьте каждое значение. Если ВСЕ значения равны нулю, пропустите этот словарь. Если ЛЮБОЕ одиночное значение не равно нулю (это будет положительное целое число, если оно не равно нулю), то я хочу сохранить в файл весь словарь.

Каждая итерация моей программы создает словарь, представляющий данные из порта коммутатора или маршрутизатора.

Поскольку мне нужен весь словарь (все двадцать одна пара ключ/значение), если хотя бы одно значение не равно нулю, я не был уверен, что добавление всех значений, а затем проверка, является ли сумма> 0, было лучшим вариантом .

Потенциально я мог бы проверять тысячи портов коммутатора.

Мне кажется, что «лучше всего» было бы начать проверять значения, и как только я нажму на ненулевое значение, я хочу сохранить весь словарь и перейти к следующему (например, перебирая порты на коммутаторе ), но я просто не уверен, как это сделать.

Я был бы признателен за некоторые идеи или примеры того, как лучше всего выполнить эту задачу.

О, и я не решаюсь использовать слово «лучший». Поскольку я буду обрабатывать тысячи портов, я не хочу, чтобы это был неэффективный подход, поэтому я не решаюсь просто сложить все значения.

Я просто не знаю, как вставить в код: «как только я увижу одно ненулевое значение, сохраните весь словарь и перейдите к следующему».


person MarkS    schedule 07.05.2017    source источник


Ответы (2)


Вот прямой перевод запроса, основанный на тех частях, которые вы уже сделали, и включающий any() применяется к значения словаря.

# I am in the process of writing a program that connects to a Cisco switch or
# router and then examines the output of a 'show int '. I then process\parse the
# data to the point where I have a dictionary of twenty-one key\value pairs.
# All values are integers.
for device in devices:
    s = run_show_interfaces(device)
    d = preprocess_parse(s)

    # Check each value. If ALL values are zero, then skip that dictionary. If ANY
    # single value is non-zero (it will be a positive integer if it is not zero),
    # then I want to save to a file the entire dictionary.
    if any(d.values()):
        filename = os.path.join(device, '.txt')
        with open(filename, 'w') as f:
            json.dump(d, f)

К вашему сведению, функция any() имеет ранний выход и прекратит поиск, как только найдет ненулевое значение. В Python 3 функция values() возвращает представление данных, поэтому не копирует всю информацию. В Python 2 используйте viewvalues()< /a> для достижения того же эффекта. В совокупности это даст вам отличную производительность.

person Raymond Hettinger    schedule 07.05.2017

если все ненулевые ключи имеют одинаковое значение, вы можете просто выполнить dict.get(x), если x нет в словаре, он ничего не вернет.

в противном случае:

    for value in dict.values():
      if value != 0:
        return true
    return false

вы также можете сначала выполнить dict.get(0) в случае, если все значения отличны от нуля.

person Andrew O'Rourke    schedule 07.05.2017