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

时间:2017-12-04 16:02:49

标签: j

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

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; ; ;之类的内容?

1 个答案:

答案 0 :(得分:2)

我猜你是在试图通过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