Подтвердить что ты не робот

Как проверить, все ли значения словаря равны 0

Я хочу проверить, все ли значения, т.е. значения, соответствующие всем ключам в словаре, равны 0. Есть ли способ сделать это без циклов? Если да, то как?

4b9b3361

Ответ 1

используйте all():

all(value == 0 for value in your_dict.values())

all возвращает True, если все элементы данного итерабельны истинны.

Ответ 2

С all:

>>> d = {1:0, 2:0, 3:1}
>>> all(x==0 for x in d.values())
False
>>> d[3] = 0
>>> all(x==0 for x in d.values())
True

Независимо от того, используете ли вы any или all, оценка будет ленивой. all возвращает False по первому значению фальши, которое он встречает. any возвращает True по первому значению правды, с которым он сталкивается.

Таким образом, not any(d.values()) предоставит вам тот же результат для приведенного в качестве примера словаря. Это немного короче версии all с пониманием генератора. Лично мне по-прежнему нравится вариант all, потому что он выражает то, что вы хотите, если читатель не должен делать логическое отрицание в своей голове.

Вот еще одна проблема с использованием any здесь:

>>> d = {1:[], 2:{}, 3:''}
>>> not any(d.values())
True

Словарь не содержит значения 0, но not any(d.values()) вернет True, потому что все значения ложны, т.е. bool(value) возвращает False для пустого списка, словаря или строки.

Вкратце: читаемость считается явной, используйте решение all.

Ответ 3

Вы можете использовать метод any(), в основном он проверяет логические параметры, но в этом случае 0 будет работать как False, а любое другое число как True. Попробуйте этот код PY2:

dict1 = {"a": 0, "b": 1}
dict2 = {"a": 0, "b": 0}

print not any(dict1.itervalues())
print not any(dict2.itervalues())

PY3:   dict1 = {"a": 0, "b": 1}   dict2 = {"a": 0, "b": 0}

print(not any(dict1.values()))
print(not any(dict2.values()))

Выход:

False
True

Edit2: один sidenote/предостережение, вызов any() с пустым списком элементов вернет False. Edit3: Спасибо за комментарии, обновил код, чтобы отразить изменения Python 3 в итерациях словаря и функции печати.

Ответ 4

Вы также можете сделать это другим способом:

>>> any(x != 0 for x in somedict.values())

Если он возвращает True, то все ключи не равны 0, иначе все клавиши равны 0