Пошел на этот вопрос в поисках основной причины моей ошибки, но не уверен, понимаю ли я, почему одно работает, а другое нет:
Грамматически для словаря, значениями которого являются кортежи:
my_dict = {'Cierra Vega': (6.2, 70), 'Alden Cantrell': (5.9, 65),
'Kierra Gentry': (6.0, 68), 'Pierre Cox': (5.8, 66)}
и мы хотим отфильтровать пары key:value
, где (а) первое значение в кортеже равно value[0]> 6
и (б) второе значение в кортеже равно value[1] > 70
,
почему сравнение кортежей, выполненное как поэлементное условное выражение, успешно
dict(filter(lambda x: (x[1][0], x[1][1]) >= (6, 70), my_dict.items()))
>>>
{'Cierra Vega':(6.2,70)}
а вот совмести-и сравнение не проходит?
dict(filter(lambda x: ((x[1][0] >= 6) and (x[1][1] >= 70)), my_dict.items()))
>>>
{}
Поэлементное условное выражение возвращает пару key:value
{'Cierra Vega':(6.2,70)}
, но второй метод возвращает пустой словарь {}
Итак, ваша вторая реализация является правильной. Обратите внимание, что 70 не > 70, поэтому результат фильтра должен быть пустым.
Прежде всего, я немного запутался в понятиях "неудача" и "успех", поскольку никакие записи вашего словаря на самом деле не удовлетворяют вашему запросу, поэтому имеет смысл, что успешный случай - это последний, когда результаты не возвращаются.
И, на самом деле, это имеет смысл, потому что кортежи упорядочены лексикографически, а это означает, что (a, b) ≥ (c, d)
тогда и только тогда a > c or (a == c and b ≥ d)
. Это обобщается не только на пары, но и на любой кортеж. Поэтому, когда вы проверяете x[1] > (6, 70)
, это совсем не эквивалентно x[1][0] > 6 and x[1][1] > 70
, отсюда и разные результаты.
Что вы подразумеваете под "не получается"? Что это дает вам по сравнению с тем, что вы ожидаете?