Как выполнить итератор zip в обратном порядке? Часовня

Как выполнить итератор zip в обратном порядке? Мне нужно сместить элементы вложенного массива.

Мой код выглядит следующим образом:

for (x,y) in zip({c..d by stride},{a..b by stride},){
    A1[x]=A1[y];
}

Мне нужно выполнить это в обратном порядке (т.е. b ->a & d->c), чтобы избежать перезаписи в случае перекрывающейся области. (a..b всегда перед c..d).

1 ответ

Решение

Несколько вещей, на которые стоит обратить внимание.

Во-первых, в вашем примере кода он использует

{c..d by stride}

например. { } Создает переменную домена, но вы просто хотите перебрать ее. Вы можете выполнять итерации по диапазону напрямую, и это синтаксически проще и быстрее. Т.е. не пишешь

for i in {1..10} { ... } // unncessary domain

вместо этого напишите это

for i in 1..10 { ... } // good

Теперь к вашему вопросу. Итерация по диапазону в обратном направлении выполняется с отрицательным шагом. Как это:

for i in 1..5 by -1 {
  writeln(i);
}

выходы

5
4
3
2
1

Такая обратная итерация может быть заключена в молнию, например:

for (i,j) in zip( 1..5 by -1, 10..50 by -10 ) {
  writeln( (i,j) );
}

выходы

(5, 50)
(4, 40)
(3, 30)
(2, 20)
(1, 10)
Другие вопросы по тегам