我想对集合的每个元素应用一个操作,用于集合的每个元素。我正在寻找类似于以下内容的东西:
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; ; ;
之类的内容?
答案 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