Как проверить одинаковые ли значения определённого поля в словаре Python
Есть цикл (stickers_dict), который проходится по словарям. Нужно каким-то образом проверять, одинаковые ли значения у всех элементов словаря у определённых полей. Если да, то выполнять условие.
Прилагаю примеры: 1) словаря, который проходит проверку, 2) словаря, который не проходит проверку:
{
0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
1: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
2: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
3: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'}
}
{
0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
1: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'},
2: {'stickerId': 101, 'slot': '4', 'codename': 'comm01_backstab', 'name': 'Backstab'},
3: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'}
}
Проверять можно по любому полю, например, stickerId, которое имеет путь stickers_dict[stickers_item]['stickerId']
Ответы (3 шт):
Автор решения: Jack_oS
→ Ссылка
Если проверка по одному полю, есть смысл функции проверки:
def check_by_key(my_dict, key_check):
values = []
for el in my_dict.values():
values.append(el[key_check])
if len(set(values) > 1:
return False
return True
Для my_dict:
my_dict = {
0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
1: {'stickerId': 2154, 'slot': '2', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
2: {'stickerId': 2154, 'slot': '3', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
3: {'stickerId': 2154, 'slot': '4', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'}
}
результат с разным key_check:
>>> check_by_key(my_dict, 'stickerId')
True
>>> check_by_key(my_dict, 'codename')
True
>>> check_by_key(my_dict, 'slot')
False
Автор решения: Zhihar
→ Ссылка
можно воспользоваться волшебной функцией str():
arr1 = {
0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
1: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
2: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
3: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'}
}
arr2 = {
0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
1: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'},
2: {'stickerId': 101, 'slot': '4', 'codename': 'comm01_backstab', 'name': 'Backstab'},
3: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'}
}
print(len({str(obj) for obj in arr1.values()}) == 1) # True
print(len({str(obj) for obj in arr2.values()}) == 1) # False
для более короткой записи можно и так:
print(len({str(arr1[key]) for key in arr1}) == 1)
Автор решения: Игорь Игоряныч
→ Ссылка
from functools import reduce
x = {
0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
1: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
2: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
3: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'}
}
y = {
0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
1: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'},
2: {'stickerId': 101, 'slot': '4', 'codename': 'comm01_backstab', 'name': 'Backstab'},
3: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'}
}
print(reduce(lambda a, b: b if x[a] == x[b] else False, x.keys()) is not False) # True
print(reduce(lambda a, b: b if y[a] == y[b] else False, y.keys()) is not False) # False