Сравниваем нейросетки на Python-задачах. Раунд 4

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

Есть структура данных, которая содержит визиты по городам:

geo_logs = [
{'visit1': ['Москва', 'Россия']},
{'visit2': ['Дели', 'Индия']},
{'visit3': ['Владимир', 'Россия']},
{'visit4': ['Лиссабон', 'Португалия']},
{'visit5': ['Париж', 'Франция']},
{'visit7': ['Тула', 'Россия']},
{'visit9': ['Курск', 'Россия']},
{'visit10': ['Архангельск', 'Россия']}]

Необходимо её отфильтровать, чтобы остались только визиты в города России. Самый типовой подход, который приводит к проблеме – удаление элементов из списка по условию прямо во время итерации по нему:

for log in geo_logs:
__for el in log.values():
____if 'Россия' not in el:
______geo_logs.remove(log)
print(geo_logs)

🤖Нашли ли ли нейросетки проблемы в таком подходе? Как его оптимизируют?
Варианты оказались разнообразными👇🏻

🔸GPT3.5 и Claude Instant решили задачу через создание нового списка и наполнение его через обратное условие, но при этом оставили вложенный цикл. Неоптимально, но верно.
Claude+ предложила два способа именно изменение исходного объекта (через создании копии и через reverse), но также от вложенного цикла не отказалась.
Этим троим по баллу.

🔸GPT4 корректно создала новый список через list comprehension. Bing также использовал list comprehension, но при этом добавив проверку на наличие строки в любых значениях словаря (это не требовалось по условию, но пусть будет). Такие варианты наиболее лаконичные. Им 2 балла.

🔸Bard использовал filter, но забыл достать из values-объекта списки, в которых и надо делать проверку на вхождение, поэтому результат получился некорректный. А Sage использовал list comrehension, но напрямую индексировал values-объект, что приведёт к ошибке. Подобные ошибки допустили ещё парочка моделей.

👉🏻Все ответы моделей тут.

📊 Промежуточные результаты после 4 раундов:
🥇 Bing, GPT4 – 6;
🥈 Bard, GPT3.5 – 4
🥉 Claude Instant, Sage – 3;
😗 Claude+ – 2;
😗 Koala – 1;
💩 Остальные по нулям.

🙄Уже все становится более-менее очевидным, никаких неожиданных результатов. После следующего раунда, если не будет каких-то открытий в целом можно подводить окончательные итоги.

Предыдущие сравнения: 1, 2, 3.