Сегодня мы продолжим «KiwiJuiceEasy». Есть много способов решить эту проблему, но я покажу вам два похожих способа и один СОВЕТ по Python. (Я полагаю, вы думали об этой практической задаче для решения.)

Problem Statement
Taro has prepared delicious kiwi fruit juice. He poured it into N bottles numbered from 0 to N-1. The capacity of the i-th bottle is capacities[i] liters, and he poured bottles[i] liters of kiwi juice into this bottle. 
Now he wants to redistribute juice in the bottles. In order to do this, he will perform M operations numbered from 0 to M-1 in the order in which he will perform them. For the i-th operation, he will pour kiwi juice from bottle fromId[i] to bottle toId[i]. He will stop pouring when bottle fromId[i] becomes empty or bottle toId[i] becomes full, whichever happens earlier. 
Return an that contains exactly N elements and whose i-th element is the amount of kiwi juice in the i-th bottle after all pouring operations are finished.

  • Редактор: вы можете изменить язык
  • После написания кода скомпилируйте и протестируйте. Затем вы можете проверить результат перед отправкой.
  • + Скомпилировать 👉 Отправить 👉 Запустить системные тесты

Код

Я думаю, что чтение чужого кода помогает мне развиваться самому. Если вы думаете обо мне, вы прочитали два кода выше и подумали, что код сравнивается с вашим кодом.

СОВЕТ ПИТОНА

Этот совет взят из книги EFFECTIVE PYTHON. (Пункт 11: Используйте zip для параллельной обработки итераторов). В нашей практике проблемы fromId и toId связаны.

for i in range(len(fromId)):
    juice_sum = bottles[fromId[i]] + battles[toId[i]]
    ...

Проблема этого кода в том, что весь этот оператор цикла визуально зашумлен. (ЭФФЕКТИВНЫЙ ПИТОН — Бретт Слаткин)

for f,t in zip(fromId, toId):
    juice_sum = bottles[f] + battles[t]
    ...

Функция Zip заставляет итератор агрегировать элементы из каждого из итерируемых объектов. (Подробнее) У этой функции есть две проблемы. Во-первых, в python2zip не является генератором, поэтому он может использовать много памяти и привести к сбою вашей программы (но мы использовали python3). Во-вторых, когда входные итераторы имеют разную длину, возникает проблема. Если вы не уверены в длине списков, рассмотрите возможность использования функции zip_longest из встроенного модуля itertools.

Следующая практическая задача — это «Интересная вечеринка». Давайте устроим вечеринку!

источник

Бретт Слаткин, EFFECTIVE PYTHON: 59 особых способов писать на Python лучше.