04 июня 2009

Несколько примеров на list comprehension в Python

Задача состояла в следующем. Для поля N×M клеток найти: а) все возможные размеры прямоугольников заданной площади; б) размеры прямоугольников, которые можно поместить на заданное поле в порядке убывания площади.
Решение.
а) необходимо перебрать все возможные комбинации x и y, для которых произведение xy = S

>>> N = 10
>>> M = 8
>>> l = [(x, y) for x in range(N) for y in range (M) if x * y == 12]
>>> l
[(2, 6), (3, 4), (4, 3), (6, 2)]
б) снова перебираем все возможные комбинации пар x и y, но уже без фильтрации и начиная с 1 (прямоугольники 0-ой площади нам не интересны):
>>> N = 4
>>> M = 3
>>> l = [(x, y) for x in range(1, N) for y in range (1, M)]
>>> l
[(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2)]
и сортируем полученный список, задав функцию сравнения как разность площадей
>>> l.sort(lambda a, b: a[0] * a [1] - b[0] * b[1])
>>> l
[(1, 1), (1, 2), (2, 1), (3, 1), (2, 2), (3, 2)]

Комментариев нет: