如何使用每个元素将操作应用于集合的所有成员

How to apply an operation to all members of a collection using each element

我想为集合中的每个元素对集合中的每个元素应用一个操作。我正在寻找类似于以下操作的东西:

result = []
for i in X:
  for j != i in X:
    if j % i == 0 (or whatever condition here)
      result += j

我可以弄清楚对集合中的每个元素应用操作的部分,但是如何让它使用集合中的每个元素对迭代对象进行操作?

因此,例如,如果我有 2 3 5 8,我将如何获得 4; ; ; 之类的东西?

我猜你是在尝试解决 adventofcode 第 3 天第 2 部分的问题吗?如果不是,那么我可能没有正确解释您的问题。

关键是一次考虑整个数组,而不是一次考虑一个项目,所以让我们忽略 for i in X:

   ]jnei=: ~:/~ 2 3 5 8                NB. for j != i in X:
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0

   ]dividesExactly=: 0 = |~/~ 2 3 5 8  NB. if j % i == 0
1 0 0 0
0 1 0 0
0 0 1 0
1 0 0 1

   mask=: jnei *. dividesExactly       NB. both conditions
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 0

   %/~ 2 3 5 8                         NB. divisions to choose from
  1 0.666667 0.4  0.25
1.5        1 0.6 0.375
2.5  1.66667   1 0.625
4  2.66667 1.6     1

   mask * %/~ 2 3 5 8                  NB. evenly divided, off-diagonals
0 0 0 0
0 0 0 0
0 0 0 0
4 0 0 0

   +/ , mask * %/~ 2 3 5 9             NB. ravel and sum to return 4
4

我可能会这样编码:

   +/ , (%/~ * ~:/~ *. 0 = |~/~) 2 3 5 8
4