我的问题是,例如我在序言上有这个列表
[[1,1],[1,1],[2,1],[2,2],[2,1],[3,1]]
我想要结果:[1,2],[2,4],[3,1]
简而言之,如果列表的第一个元素相等,我想对该列表的第二个元素求和,
并返回一个在第一个位置具有相同元素的列表,并将第二个元素的总和作为列表的第二个元素。
我觉得在 python 之类的东西上很容易做到这一点,但在序言中我想不出办法来做到这一点。
递归访问对我来说似乎是最简单的方法:
sum_keys([], []).
sum_keys([[K,V]|L], U) :-
sum_keys(L, S),
( select([K,C], S, T),
N is V+C,
U = [[K,N]|T]
; U = [[K,V]|S]
).
这产生
?- sum_keys([[1,1],[1,1],[2,1],[2,2],[2,1],[3,1]],R),sort(R,S).
R = S, S = [[1, 2], [2, 4], [3, 1]] .
请注意,pair 表示不是最优的:在 Prolog 中我们通常采用Key-Value
,然后我们可以访问一些库,并编写
:- [library(pairs)].
list2pair([K,V], K-V).
sum_value_list(K-L, K-S) :- sumlist(L,S).
sum_keys(L, S) :-
maplist(list2pair, L, Ps),
group_pairs_by_key(Ps, Grouped),
maplist(sum_value_list, Grouped, Summed),
maplist(list2pair, S, Summed).
当然,list2pair 转换是由于表示不匹配。