Я пытаюсь понять, как сделать утверждение, чтобы увидеть, существует ли число в списке.
Итак, мой список выглядит так:
data = [{'value': Decimal('4.21'), 'Type': 'sale'},
{'value': Decimal('84.73'), 'Type': 'sale'},
{'value': Decimal('70.62'), 'Type': 'sale'},
{'value': Decimal('15.00'), 'Type': 'credit'},
{'value': Decimal('2.21'), 'Type': 'credit'},
{'value': Decimal('4.21'), 'Type': 'sale'},
{'value': Decimal('84.73'), 'Type': 'sale'},
{'value': Decimal('70.62'), 'Type': 'sale'},
{'value': Decimal('15.00'), 'Type': 'credit'},
{'value': Decimal('2.21'), 'Type': 'credit'}]
Теперь я пытаюсь перебрать список, например:
for i in data:
s = i['value']
print(s)
assert 2.21 in i['value'], "Value should be there"
Я каким-то образом получаю только первое число, возвращаемое для «значения», то есть 4,21.
Две основные вещи здесь идут не так. 1. Вы сравниваете str
с Decimal
, которые никогда не будут равны. 2. Вы делаете утверждение для каждого значения, поэтому первое значение, которое не равно, создаст ошибку утверждения.
Вы, вероятно, хотите что-то большее, например: assert any(d['value'] == Decimal('2.21') for d in data)
проверить, имеет ли any
dict в списке это значение.
да, это была опечатка с моей стороны. исправил это.
Нет, вы этого не сделали, теперь вы сравниваете число с плавающей запятой с десятичным числом, вам нужно сделать assert Decimal('2.21')
У вас есть две проблемы, как указали другие комментаторы. Вы сравниваете неправильные типы данных (str
с Decimal
или после редактирования float
с Decimal
), а также завершаете работу при первом сбое. Вы наверное хотели написать:
assert Decimal('2.21') in (d["value"] for d in data)
Это позволит извлечь значение ключа "value"
из каждого подсловаря внутри списка и найти в них Decimal('2.21')
.
Это кажется более понятным, чем код any()
, который я оставил в комментарии.
Как вы думаете, почему строка
"2.21"
должна быть «in
»Decimal(2.21)
?