Просто для удовольствия, вот одна строка с использованием некоторых функциональных инструментов Python. Ключевыми ингредиентами являются functools.partial
, itertools.chain.from_iterable
и operator.not_
, все из которых получены из Модули функционального программирования раздел документации стандартной библиотеки Python.
>>> import functools, itertools, operator
>>> board = [2, 4, 0, 2, 8, 4, 4, 8, 0, 2, 0, 0, 4, 0, 2, 2]
>>> list(itertools.chain.from_iterable(map(functools.partial(sorted, key=operator.not_), zip(*[iter(board)]*4))))
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]
Большая часть работы здесь заключается в том, чтобы превратить линейное представление платы в представление вложенных списков списков, а затем снова повернуть его обратно. Вот это пошагово.
Во-первых, превратив плоское представление во вложенное:
>>> nested = list(zip(*[iter(board)]*4))
>>> nested
[(2, 4, 0, 2), (8, 4, 4, 8), (0, 2, 0, 0), (4, 0, 2, 2)]
Я добавил этот дополнительный внешний list
вызов, чтобы показать содержимое итерируемого zip
. Это не обязательно, если все шаги объединены. Теперь отсортируйте каждую строку подходящим ключом, чтобы переместить нули вправо:
>>> sorted_nested = list(map(functools.partial(sorted, key=operator.not_), nested))
>>> sorted_nested
[[2, 4, 2, 0], [8, 4, 4, 8], [2, 0, 0, 0], [4, 2, 2, 0]]
Опять же, вызов внешнего списка не нужен, и мы потеряем его, когда соберем все вместе. Ключевым моментом здесь является то, что функция Python sorted
обеспечивает стабильную сортировку, поэтому ненулевые элементы остаются в том же порядке по отношению друг к другу. Наконец, вернемся в список:
>>> list(itertools.chain.from_iterable(sorted_nested))
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]
Собрав все это вместе и удалив ненужные внутренние преобразования в список, вы получите один вкладыш вверху этого поста.
>>> list(itertools.chain.from_iterable(map(functools.partial(sorted, key=operator.not_), zip(*[iter(board)]*4))))
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]