Python:
rotated = zip(*original[::-1]) # On Python 3, list(zip(*original[::-1]))
Дешевый, я знаю.
И против часовой стрелки:
rotated_ccw = zip(*original)[::-1] # On Python 3, list(zip(*original))[::-1]
, Как это работает: (Требуемый в комментариях)
zip(*original)
подкачает оси 2-х массивов путем укладки соответствующих объектов из списков в новые списки. (*
оператор говорит функции распределять содержавшие списки в аргументы)
>>> zip(*[[1,2,3],[4,5,6],[7,8,9]])
[[1,4,7],[2,5,8],[3,6,9]]
[::-1]
, оператор инвертирует элементы массива (см. Расширенные Части ).
>>> [[1,2,3],[4,5,6],[7,8,9]][::-1]
[[7,8,9],[4,5,6],[1,2,3]]
Наконец, комбинируя эти два приведет к преобразованию вращения.
изменение в размещении [::-1]
инвертирует списки в разных уровнях матрицы.
Следующее установит свойства A и B как результат двух разных поисков в реестре. Если поиск B был успешным, он заменяет значение A значением B.
<Property Id="A">
<!-- registry search 1 here -->
</Property>
<Property Id="B">
<!-- registry search 2 here -->
</Property>
<SetProperty Id="A" After="AppSearch" Value="[B]">
B
</SetProperty>
Обратите внимание, что элемент SetProperty использует значение B дважды: один раз как Value = "[B]"
для отмены значение A и один раз как текст условия настраиваемого действия. After = "AppSearch"
гарантирует, что настраиваемое действие выполняется сразу после поиска в реестре.
См. Также этот ответ Роба Меншинга