Функциональное программирование функций с использованием 2 списков в D - PullRequest
1 голос
/ 31 мая 2019

Если у меня есть 2 списка:

list1 = [1, 2, 3, 4];
list2 = [10, 25, 35, 58];

и я хочу получить список, в котором есть продукты соответствующих элементов из 2 списков;

В Python можно сделать:

outlist = list(map(lambda a,b: a*b, list1, list2))

Однако в D я знаю следующий метод:

import std.stdio; 
void main(){
    auto list1 = [1, 2, 3, 4];
    auto list2 = [10, 25, 35, 58];
    int[] outlist; 
    foreach(i, item; list1){    
        outlist ~= item*list2[i];
    }
    writeln(outlist); 
}

Мои вопросы:

В1: Можно ли сохранить оба списка в качестве аргумента foreach?

Q2: Как умножить соответствующие элементы 2 списков, используя функцию карты?

Спасибо за понимание.

1 Ответ

5 голосов
/ 31 мая 2019

Ключ должен использовать zip для объединения элементов двух списков (или динамических массивов , как они известны в D) в один массив кортежи перед применением map или foreach. К элементам кортежа можно получить доступ с индексом, начинающимся с нуля (т.е. a[0] и a[1] в этом примере).

import std.algorithm.iteration : map;
import std.range : zip;
import std.stdio : writeln;

void main() {
  auto list1 = [1, 2, 3, 4];
  auto list2 = [10, 25, 35, 58];

  // Question #2
  auto list3 = zip(list1, list2).map!(a => a[0] * a[1]);

  writeln(list3);

  // Question #1
  typeof(list1) list4;
  foreach(a; zip(list1, list2)) {
    list4 ~= a[0] * a[1];
  }

  writeln(list4);
}

Код выше печатается дважды:

[10, 50, 105, 232]

как и ожидалось.

...