使用 D 中的 2 个列表的函数式编程函数

Functional programming functions using 2 lists in D

如果我有 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); 
}

我的问题是:

Q1:能否将两个列表都作为 foreach 的参数?

Q2:如何使用map函数将2个列表的对应元素相乘?

感谢您的见解。

关键是在应用mapforeach之前使用zip to combine the elements of the two lists (or dynamic arrays as they are known in D) to a single array of tuples。可以使用基于零的索引访问元组元素(即本例中的 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]

符合预期。